01
Aoû
2004

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 "/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 ...

Posté par Renaud Castéran à 13:08 dans la catégorie Articles | RSS catégorie
Tag(s) associé(s) :
Partager cet article : Ajouter en favori sur KreuZZPoster cet article sur ScoopeoPoster cet article sur FuzzPoster cet article sur diggAjouter en favori sur Del.icio.usPoster cet article sur reddit
manumanu
03/08/04 12:44:41

Il manque juste un petit " }" à la ligne 23, après: "... case E_NOTICE : { $stopper = false; $type_erreur = "Notification"; break; ..."

;-) Bon article!

renaud
renaud
16/08/04 10:37:36

Oooppppsss comment ais-je pu commettre cette erreur ??? Désolé pour cette accolade manquante ...

corto
17/11/04 21:05:26

erreur aussi dans le premier case; la variable s'apelle $type et non pas $type_erreur

mifrog
21/03/05 10:20:44

bonjour. Comment se fait-il que le script de gestion des erreurs ne détecte jamais les erreurs de type E_PARSE? J'ai php 4.3.3. J'ai modifié les petites erreurs dans le script (paranthèse manquante, variable type), j'ai testé à mort ce script, et il ne détecte en fait que les erreurs de type E_USER_WARNING, E_USER_NOTICE, E_USER_ERROR...

OnRencontre
18/10/06 15:14:10

Enfin un article complet et bien expliqué à ce sujet... bravo !

pioc
09/07/07 16:36:50

Le script ne détecte pas les erreurs fatales. normal car elles interrompent le script et ne permettent donc pas la gestion d'erreur! Pour détecter les erreurs fatales, il faut utiliser le fichier de log de php

Les commentaires ne sont pas autorisés pour ce billet