Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. PHP 8
  3. Gérer les erreurs dans un script PHP
Extrait - PHP 8 Développez un site web dynamique et interactif (2e édition)
Extraits du livre
PHP 8 Développez un site web dynamique et interactif (2e édition) Revenir à la page d'achat du livre

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.

images/logoversion8.png

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()...