En PHP, la gestion des erreurs par défaut est simple. Un message d'erreur est envoyé au navigateur avec le nom du fichier, le numéro de ligne et un message décrivant l'erreur.
La gestion des erreurs est un élément important lors de la création de scripts et d'applications Web. Si votre code manque de codage de détection d’erreurs, le programme n’aura pas l’air professionnel et ouvrira la porte à des risques de sécurité.
Ce didacticiel présente certaines des méthodes de détection d'erreurs les plus importantes en PHP.
Nous vous expliquerons différentes méthodes de gestion des erreurs :
Simple instruction "die()"
Erreurs personnalisées et déclencheurs d'erreurs
rapport d'erreur
Le premier exemple montre un script simple qui ouvre un fichier texte :
<?php$file=fopen("welcome.txt","r");?>
Si le fichier n'existe pas, vous obtiendrez une erreur comme celle-ci :
Avertissement : fopen(welcome.txt) [function.fopen] : échec de l'ouverture du flux : aucun fichier ou répertoire de ce type dans /www/codercto/test/test.php à la ligne 2
Pour éviter que les utilisateurs reçoivent des messages d'erreur comme celui ci-dessus, nous vérifions si le fichier existe avant d'y accéder :
<?phpif(!file_exists("welcome.txt")){ die("Le fichier n'existe pas");}else{ $file=fopen("welcome.txt","r");}?>
Maintenant, si le fichier n'existe pas, vous obtiendrez un message d'erreur comme celui-ci :
Le fichier n'existe pas
Le code ci-dessus est plus efficace que le code précédent car il utilise un mécanisme simple de gestion des erreurs pour terminer le script après une erreur.
Cependant, il n’est pas toujours approprié de simplement terminer le script. Examinons les fonctions PHP alternatives pour gérer les erreurs.
La création d'un gestionnaire d'erreurs personnalisé est très simple. Nous avons simplement créé une fonction dédiée qui peut être appelée lorsqu'une erreur survient en PHP.
La fonction doit être capable de gérer au moins deux paramètres (niveau d'erreur et message d'erreur), mais peut accepter jusqu'à cinq paramètres (facultatif : fichier, numéro de ligne et contexte d'erreur) :
fonction_erreur (niveau_erreur, message_erreur, fichier_erreur, ligne_erreur, contexte_erreur)
paramètre | décrire |
---|---|
niveau_erreur | Requis. Spécifie le niveau de rapport d'erreurs pour les erreurs définies par l'utilisateur. Doit être un nombre. Consultez le tableau ci-dessous : Niveaux de rapport d'erreurs. |
message_erreur | Requis. Spécifie les messages d'erreur pour les erreurs définies par l'utilisateur. |
fichier_erreur | Facultatif. Spécifie le nom du fichier dans lequel l'erreur s'est produite. |
ligne_erreur | Facultatif. Spécifie le numéro de ligne où l'erreur s'est produite. |
contexte_erreur | Facultatif. Spécifie un tableau contenant chaque variable utilisée lorsque l'erreur s'est produite et leurs valeurs. |
Ces niveaux de rapport d'erreurs correspondent à différents types d'erreurs gérées par des gestionnaires d'erreurs définis par l'utilisateur :
valeur | constante | décrire |
---|---|---|
2 | E_AVERTISSEMENT | Erreur d'exécution non fatale. Ne suspendez pas l’exécution du script. |
8 | E_AVIS | notifications d'exécution. Se produit lorsque le script détecte une erreur possible, mais peut également se produire lorsque le script s'exécute normalement. |
256 | E_USER_ERROR | Erreur fatale générée par l'utilisateur. Ceci est similaire à E_ERROR défini par le programmeur à l'aide de la fonction PHP trigger_error(). |
512 | E_USER_WARNING | Avertissement non fatal généré par l'utilisateur. Ceci est similaire au E_WARNING défini par le programmeur à l'aide de la fonction PHP trigger_error(). |
1024 | E_USER_NOTICE | Notifications générées par l'utilisateur. Ceci est similaire à E_NOTICE défini par le programmeur à l'aide de la fonction PHP trigger_error(). |
4096 | E_RECOVERABLE_ERROR | Erreurs fatales détectables. Comme E_ERROR, mais peut être intercepté par des gestionnaires définis par l'utilisateur. (Voir set_error_handler()) |
8191 | E_TOUS | Toutes les erreurs et avertissements. (En PHP 5.4, E_STRICT fait partie de E_ALL) |
Créons maintenant une fonction qui gère les erreurs :
function customError($errno, $errstr){ echo "<b>Erreur :</b> [$errno] $errstr<br>" echo "Fin du script die();}
Le code ci-dessus est une simple fonction de gestion des erreurs. Lorsqu'il est déclenché, il obtient le niveau d'erreur et le message d'erreur. Il imprime ensuite le niveau d'erreur et le message, puis termine le script.
Maintenant que nous avons créé une fonction de gestion des erreurs, nous devons déterminer quand la déclencher.
Le gestionnaire d'erreurs par défaut de PHP est le gestionnaire d'erreurs intégré. Nous allons transformer la fonction ci-dessus en gestionnaire d'erreurs par défaut lorsque le script est en cours d'exécution.
Les gestionnaires d'erreurs peuvent être modifiés pour s'appliquer uniquement à certaines erreurs, afin que le script puisse gérer différentes erreurs différemment. Cependant, dans ce cas, nous allons utiliser notre gestionnaire d'erreurs personnalisé pour toutes les erreurs :
set_error_handler("customError");
Puisque nous voulons que notre fonction personnalisée gère toutes les erreurs, set_error_handler() ne nécessite qu'un seul argument, et un deuxième argument peut être ajouté pour spécifier le niveau d'erreur.
Testez ce gestionnaire d'erreurs en essayant d'imprimer une variable qui n'existe pas :
<?php// Fonction de gestion des erreurs function customError($errno, $errstr){ echo "<b>Erreur :</b> [$errno] $errstr";}// Définir la fonction de gestion des erreurs set_error_handler("customError") ;//Erreur de déclenchement echo($test);?>
Le résultat du code ci-dessus ressemble à ceci :
Erreur : [8] Variable non définie : test
Lorsque l'utilisateur saisit des données dans un script, il est utile de déclencher une erreur lorsque la saisie de l'utilisateur n'est pas valide. En PHP, cette tâche est accomplie par la fonction trigger_error().
Dans cet exemple, si la variable "test" est supérieure à "1", une erreur se produit :
<?php$test=2;if ($test>1){ trigger_error("La valeur de la variable doit être inférieure ou égale à 1");}?>
Le résultat du code ci-dessus ressemble à ceci :
Remarque : la valeur de la variable doit être inférieure ou égale à 1in /www/test/codercto.php à la ligne 5
Vous pouvez déclencher une erreur n'importe où dans le script et, en ajoutant un deuxième paramètre, vous pouvez spécifier le niveau d'erreur déclenché.
Types d'erreurs possibles :
E_USER_ERROR - Erreur d'exécution fatale générée par l'utilisateur. L'erreur ne peut pas être récupérée. L'exécution du script a été interrompue.
E_USER_WARNING - Avertissement d'exécution non fatal généré par l'utilisateur. L'exécution du script n'est pas interrompue.
E_USER_NOTICE - Par défaut. Notifications d'exécution générées par l'utilisateur. Se produit lorsque le script détecte une erreur possible, mais peut également se produire lorsque le script s'exécute normalement.
Dans cet exemple, si la variable « test » est supérieure à « 1 », une erreur E_USER_WARNING se produit. Si E_USER_WARNING se produit, nous utiliserons notre gestionnaire d'erreurs personnalisé et terminerons le script :
<?php// Fonction de gestion des erreurs customError($errno, $errstr){ echo "<b>Erreur :</b> [$errno] $errstr<br>"; echo "Fin du script die(); }//Définir la fonction de gestion des erreurs set_error_handler("customError",E_USER_WARNING);//Déclencher l'erreur $test=2;if ($test>1){ trigger_error("La valeur de la variable doit être inférieure ou égale à 1",E_USER_WARNING);}?>
Le résultat du code ci-dessus ressemble à ceci :
Erreur : [512] La valeur de la variable doit être inférieure ou égale à 1. Fin du script
Maintenant que nous avons appris comment créer nos propres erreurs et comment les déclencher, examinons la journalisation des erreurs.
Par défaut, PHP envoie les journaux d'erreurs au système ou au fichier de journalisation du serveur, en fonction de la configuration error_log dans php.ini. En utilisant la fonction error_log(), vous pouvez envoyer des enregistrements d'erreurs vers un fichier spécifié ou une destination distante.
Vous envoyer un message d'erreur par e-mail est un bon moyen d'être averti d'une erreur spécifiée.
Dans l'exemple ci-dessous, si une erreur spécifique se produit, nous enverrons un e-mail avec un message d'erreur et terminerons le script :
<?php// Fonction de gestion des erreurs customError($errno, $errstr){ echo "<b>Erreur :</b> [$errno] $errstr<br>" echo "L'administrateur du site Web a été averti"; ("Erreur : [$errno] $errstr",1, "[email protected]","De : [email protected]");}// Définir la fonction de gestion des erreurs set_error_handler("customError",E_USER_WARNING); // Déclencheur d'erreur $test=2;if ($test>1){ trigger_error("La valeur de la variable doit être inférieure ou égale à 1",E_USER_WARNING);} ?>
Le résultat du code ci-dessus ressemble à ceci :
Erreur : [512] La valeur de la variable doit être inférieure ou égale à 1. L'administrateur du site Web a été averti
L'e-mail reçu du code ci-dessus ressemble à ceci :
Erreur : [512] La valeur de la variable doit être inférieure ou égale à 1
Cette méthode ne convient pas à toutes les erreurs. Les erreurs générales doivent être enregistrées sur le serveur à l'aide du système de journalisation PHP par défaut.