Gestion des erreurs en PHP
3) Gestion avancée des erreurs
PHP offre la possibilité aux développeurs de gérer eux-mêmes les erreurs susceptibles de survenir en cours d'exécution d'un script. Il convient cependant de noter que les erreurs de type fatal error ne sont pas prises en considération.
Cette méthode consiste à créer une fonction qui constituera le gestionnaire d'erreurs et à utiliser certaines fonctions prédéfinies de PHP pour interagir avec notre gestionnaire.
La première partie de ce chapitre présente ces dernières.
La seconde partie vous montre le développement de la fonction de gestion des erreurs.
set_error_handler()
Cette fonction admet un paramètre de type chaîne de caractère. Elle permet de définir la fonction utilisateur qui servira à gérer les erreurs dans un script.
Elle retourne un pointeur sur l'ancienne fonction de gestion des erreurs (s'il y en avait une) ou FALSE en cas d'erreur.
restore_error_handler()
Utilisée après avoir modifié la fonction de gestion des erreurs, elle permet de revenir à l'ancienne version du gestionnaire d'erreurs. Ce peut être soit la fonction PHP par défaut, soit une autre fonction utilisateur.
error_reporting()
error_reporting() permet de modifier le paramètre error_reporting du fichier php.ini.
Elle accepte en paramètre les constantes de types d'erreurs (voir le chapitre 1) avec les opérateurs de comparaison & (et), | (ou) et ~ (sauf).
trigger_error()
Cette fonction est utilisée pour déclencher une erreur utilisateur. Elle prend en paramètre une chaîne de caractère correspondant au message d'erreur. Il faut noter que cette chaîne de caractère ne doit pas excéder 1024 caractères.
Un second argument optionnel permet de préciser le type d'erreur par le biais des constantes prédéfinies.
Exemple :
<?php
// Déclaration de variables
$a = 4;
$b = 0;
// On veut diviser $a par $b
if ($b == 0) {
trigger_error ("Erreur !!! Division par zéro impossible ..." , E_ERROR);
exit ();
}
else {
echo $a . "/" . $b . " = " . ($a / $b);
}
?>
Son intérêt est de pouvoir être utilisée en conjonction avec le gestionnaire d'erreur par défaut ou un gestionnaire programmé par le développeur.
error_log ()
Cette fonction permet de stocker un message d'erreur. Elle admet plusieurs paramètres qui sont :
- (obligatoire) le message d'erreur sous la forme d'une chaîne de caractères,
- (optionel) le type de message sous la forme d'un entier. Sa valeur peut être
- le message est envoyé à l'historique PHP, basé sur l'historique système ou un fichier, en fonction de la configuration de error_log dans le fichier php.ini
- le message est envoyé par mail à l'adresse précisée dans le troisième argument de la fonction.
- le message est envoyé par le réseau à l'adresse précisée dans le troisième argument de la fonction. On précisera éventuellement le numéro de port.
- le message est ajouté à la fin du fichier précisé dans le troisième argument de la fonction.
- (optionel) la destination du message d'erreur à renseigner si vous spécifier que le message doit être envoyé par mail, réseau ou à l'historique PHP.
3.2) Développement d'un gestionnaire d'erreurs
Maintenant que nous avons pris connaissance de toutes les fonctions qui vont nous être utiles, nous pouvons commencer le développement de notre gestionnaire d'erreur.
Il peut être intéressant de coder ce gestionnaire dans un fichier PHP séparé que vous appellerez dans chaque page de votre site.
La fonction que je vais présenter permet :
- d'afficher un message d'erreur selon le type d'erreur rencontré,
- d'enregistrer ce message d'erreur dans un fichier.
- de stopper le script le cas échéant.
Cette fonction doit accepter un minimum de deux arguments, le numéro et la description de l'erreur.
Elle peut également recevoir trois autres paramètres optionnels qui sont le fichier contenant le code qui a provoqué l'erreur, la ligne à laquelle elle se trouve et un tableau contenant la liste des variables incriminées.
Nous en avons fini avec la théorie, passons maintenant au plus intéressant ... Le code de notre gestionnaire !!!
Le fichier gestion_erreurs.php :
<?php
// La fonction de gestion des erreurs
function monGestionnaire ($errno , $errstr , $errfile , $errline)
{
// Variables nécessaires au traitement des erreurs
// Booléen permettant d'indiquer si on doit stopper ou non l'exécution du script
// Par défaut on stop
$stopper = true;
// Booléen permettant d'indiquer si on doit ou non afficher le message d'erreur
// Par défaut on masque
$afficher = false;
// On détermine le type d'erreur et on affecte les variables et le cas échéant
switch ($errno)
{
case E_USER_NOTICE :
case E_NOTICE :
{
$stopper = false;
$type_erreur = "Notification";
break;
case E_COMPILE_WARNING :
case E_CORE_WARNING :
case E_USER_WARNING :
case E_WARNING :
{
$stopper = false;
$type = "Avertissement";
break;
}
case E_PARSE :
{
$afficher = true;
$type = "Syntaxe";
}
case E_COMPILE_ERROR :
case E_CORE_ERROR :
case E_USER_ERROR :
case E_ERROR :
{
$afficher = true;
$type = "Erreur";
break;
}
default :
{
//echo "Erreur inconnue : [" . $errno . "] => " . $errstr . "<br>";
$afficher = true;
$type = "Erreur inconnue";
break;
}
}
// Construction du message d'erreur
$message = $type . " à " . date ("H:i:s d/m/Y") . " : " . $errstr;
$message .= "<br />";
$message .= "dans le fichier " . $errfile . " à la ligne " . $errline;
// On teste la valeur de la variable
if ($afficher == true)
echo $message;
// On enregistre l'erreur dans le fichier '/var/php/erreurs.log'
error_log ($message , 3 , "/var/php/erreurs.log");
// On teste la valeur de la variable $stopper
if ($stopper == true)
exit ();
}
// Fin de la fonction
// On définit le niveau d'erreur souhaité
error_reporting (E_ALL);
// On précise au script le gestionnaire d'erreurs
$ancien_gest = set_error_handler ("monGestionnaire");
?>
Après avoir coder cette fonction, il ne nous reste plus qu'à l'inclure dans vos fichiers de scripts.
Au début de chacun de vos fichiers de script :
<?php
// On inclut le fichier contenant la fonction de gestion des erreurs
// On suppose que votre serveur Web est Apache, que sa racine est /var/apache/www/
// et que le fichier à inclure se trouve dans le répertoire includes/
include ("/var/apache/www/includes/gestion_erreurs.php");
?>
Et voilà, vous disposez maintenant de votre propre gestionnaire d'erreurs ...