Gérer les erreurs dans un script PHP
Vue d’ensemble
Une erreur, dans un script PHP, peut se manifester de deux façons, éventuellement simultanées :
-
par une valeur de retour particulière de la fonction PHP dans laquelle l’erreur est rencontrée ;
-
par un message envoyé directement dans la page.
Exemples
Fonction |
Comportement en cas d’erreur |
require |
Si le fichier passé en paramètre n’existe pas, un message est affiché mais aucun code particulier n’est retourné par la fonction. |
mysqli_query |
Si le serveur MySQL retourne une erreur sur l’exécution d’une requête, aucun message n’est affiché mais la fonction retourne FALSE (la nature de l’erreur pouvant être récupérée par d’autres fonctions). |
mysqli_connect |
Si le serveur MySQL retourne une erreur lors de la connexion, un message est affiché et la fonction retourne FALSE (la nature de l’erreur pouvant être récupérée par d’autres fonctions). |
Gérer les erreurs dans un script PHP consiste donc, en général, à mettre en place un mécanisme qui permette de détecter la génération d’une erreur afin d’afficher soi-même un message à la place du message directement affiché par PHP.
Les messages d’erreur PHP
Les messages d’erreur (ou d’alerte) affichés par PHP ont un niveau correspondant à leur gravité :
Valeur |
Constante associée |
Description |
1 |
E_ERROR |
Erreur fatale d’exécution (message "fatal error: …"). Le script s’interrompt. Exemples : appel à une fonction qui n’existe pas, fichier mentionné dans l’instruction require qui n’existe pas. |
2 |
E_WARNING |
Alerte d’exécution (message "warning: …"). Le script se poursuit. Exemple : tentative d’ouverture, avec fopen, d’un fichier qui n’existe pas, ouverture d’une connexion MySQL qui échoue… Généralement, la poursuite du script provoque d’autres messages du même type. |
4 |
E_PARSE |
Erreur de compilation ("Parse error: …"). Le script ne s’exécute pas. Exemple : oubli d’un point-virgule, d’une parenthèse fermante… |
8 |
E_NOTICE |
Avertissement lors de l’exécution (message "Notice: …"). Par défaut, PHP est configuré pour ne pas afficher ces avertissements. Le script se poursuit. |
16 |
E_CORE_ERROR |
Erreur fatale lors de l’initialisation de PHP. Le script ne s’exécute pas. |
32 |
E_CORE_WARNING |
Alerte lors de l’initialisation de PHP. |
64 |
E_COMPILE_ERROR |
Erreur fatale lors de la compilation. Le script ne s’exécute pas. |
128 |
E_COMPILE_WARNING |
Alerte lors de la compilation. |
256 |
E_USER_ERROR |
Erreur générée par le développeur. Le script s’interrompt. |
512 |
E_USER_WARNING |
Alerte générée par le développeur. |
1024 |
E_USER_NOTICE |
Avertissement généré par le développeur. |
2048 |
E_STRICT |
Conseils lors de l’exécution. Autorise PHP à suggérer des modifications... |
Les fonctions de gestion des erreurs
PHP propose plusieurs fonctions permettant de gérer correctement les erreurs dans un script :
Nom |
Rôle |
error_reporting |
Définit les niveaux d’erreur qui sont affichés par PHP. |
error_log |
Envoie un message d’erreur vers une destination (fichier par exemple). |
set_error_handler |
Indique le nom d’une fonction utilisateur à utiliser comme gestionnaire d’erreurs. |
restore_error_handler |
Réactive l’ancien gestionnaire d’erreurs. |
set_exception_handler |
Indique le nom d’une fonction utilisateur à employer comme gestionnaire d’exception. |
restore_exception_handler |
Réactive l’ancien gestionnaire d’exception. |
trigger_error, user_error |
Déclenchent une erreur définie par le développeur (user_error est un alias de trigger_error). |
error_get_last |
Retourne des informations sur la dernière erreur rencontrée dans le script. |
error_clear_last |
Efface la dernière erreur rencontrée dans le script. |
Il existe aussi deux fonctions, debug_backtrace et debug_print_backtrace, qui permettent d’obtenir des informations utiles pour la mise au point (contexte d’exécution et pile des appels) ; pour en savoir plus sur ces deux fonctions, reportez-vous à la documentation.
En complément, l’opérateur @, placé devant le nom d’une fonction, permet de supprimer l’affichage des messages générés en cas d’erreur dans la fonction.
Exemple
<?php
$fichier = @fopen('/tmp/infos.txt','r'); // le fichier n'existe pas
?>
Lors de l’exécution de ce script, aucun message n’est affiché bien que le fichier demandé n’existe pas.
Depuis la version 8, l’opérateur @ ne supprime plus l’affichage des erreurs fatales qui provoquent l’arrêt...