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). |
oci_execute |
Si le serveur Oracle retourne une erreur sur l’exécution d’une requête, 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 permettant 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. Exemples : 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. Exemples : oubli d’un point-virgule, d’une parenthèse fermante... |
8 |
E_NOTICE |
Avertissement lors de l’exécution (message "Notice: ..."). 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 pour améliorer la portabilité du code, notamment vers les futures versions. |
4096 |
E_RECOVERABLE_ERROR |
Erreur fatale récupérable. Si l’erreur n’est pas gérée par le développeur (voir plus loin), le script s’interrompt. |
8192 |
E_DEPRECATED |
Alertes lors de l’exécution. Permet d’afficher des alertes sur le code qui utilise des fonctionnalités dépréciées et qui pourrait ne plus fonctionner dans des versions futures. |
16384... |
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 à employer 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');
?>
Lors de l’exécution de cette instruction, 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 du script (E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR). Avant la version 8, l’exécution du script était stoppée mais aucun message n’était affiché.
Exemple
<?php
$fichier = @fopen('/tmp/infos.txt','r');
$texte = @fread($fichier,100);
@fclose($fichier);
?>
Résultat
Fatal error: Uncaught TypeError: fread(): Argument #1 ($stream) must be
of type resource, bool given in /app/scripts/index.php:3...
Exercice 7 : gérer les erreurs
Dans cet exercice, nous allons apprendre à gérer les erreurs dans un script PHP.
Étape 1
Nous allons analyser ce qui se passe si un script cherche à lire le contenu d’un fichier qui n’existe pas.
Indications :
-
Dans un nouveau répertoire, copiez le script accueil.php développé dans l’exercice 4 (sans copier le fichier auteurs.txt).
-
Appelez ce script dans votre navigateur.
Résultat attendu
Warning: file(auteurs.txt): Failed to open stream: No such file or
directory in /app/scripts/exercices/07/accueil.php on line 3
Warning: foreach() argument must be of type array|object, bool given in
/app/scripts/exercices/07/accueil.php on line 22
Auteurs |
En l’état actuel des choses, si le fichier auteurs.txt n’existe pas, deux erreurs se produisent et sont affichées dans la page, une lors de la lecture du fichier et une lors du parcours du tableau (suite à l’erreur initiale la variable $auteurs contient la valeur FALSE).
Étape 2
Nous souhaitons améliorer le comportement de notre script en cas d’erreur en contrôlant l’affichage du message d’erreur.
Indications :
-
Au début du script, insérez une instruction qui désactive l’affichage des erreurs de PHP.
-
Testez le résultat de l’appel à la fonction file()...