Gérer les erreurs dans un script PHP Exemple d'erreur PHP : error_reporting

La fonction error_reporting permet de définir les niveaux d'erreur pour lesquels le programme laisse PHP afficher les messages.

Syntaxe

entier error_reporting([entier niveaux])
niveaux : Niveaux d'erreur affichés par PHP, exprimés sous la forme d'une somme des valeurs affectées à chaque niveau.

La fonction error_reporting retourne l'ancienne valeur. Appelée sans paramètre, cette fonction se contente de retourner la valeur courante sans rien changer.

Afin de définir les niveaux souhaités, il est vivement conseillé, pour la compatibilité future, d'utiliser les constantes et de ne pas mettre les valeurs en dur dans le programme.

La constante E_ALL, égale à la somme de toutes les autres constantes, peut être utilisée pour demander l'affichage de tous les niveaux d'erreur.

Inversement, un niveau égal à 0 provoque la suppression de l'affichage de tous les messages ; c'est l'équivalent, pour l'ensemble du script, de l'opérateur @ qui peut être utilisé sur une fonction.

Telles que les valeurs de niveaux d'erreur sont définies, spécifier plusieurs niveaux se fait très simplement par des opérations arithmétiques sur les constantes.

Exemple

E_ERROR+E_WARNING
Niveaux E_ERROR et E_WARNING
E_ALL-E_USER_ERROR-
E_USER_WARNING-E_USER_
NOTICE

Tous les niveaux sauf E_USER_ERROR, E_USER_WARNING, et E_USER_NOTICE

La valeur par défaut (tout sauf E_NOTICE = E_ALL-E_NOTICE) est définie par la directive de configuration error_reporting.

En complément, la directive de configuration display_errors permet d'autoriser (on) ou d'interdire (off) l'affichage des messages d'erreur ; si display_errors est à off, donner une valeur quelconque à error_reporting (dans le fichier .ini ou dans un script) est sans effet.

En phase de développement, il est conseillé d'afficher toutes les erreurs (E_ALL), y compris les avertissements, afin d'écrire le code le plus propre possible.

Exemple

<?php
// Valeur courante de error_reporting.
echo '<b>error_reporting = ',error_reporting(),'</b><br />';
// Par défaut égal à tout sauf E_NOTICE = E_ALL – E_NOTICE.
echo '= E_ALL - E_NOTICE = ',(E_ALL-E_NOTICE),'<br />';
// Affichage d'une variable non initialisée.
echo "\$x (non initialisée) = $x => pas de message <br />";
// Passage de error_reporting à E_ALL (tout).
error_reporting(E_ALL);
echo '<b>error_reporting = E_ALL</b><br />';
// Affichage d'une variable non initialisée.
echo "\$x (non initialisée) = $x => message <br />";
// Lecture d'un fichier qui n'existe pas.
if (! readfile('/tmp/infos.txt')) {
echo 'Erreur dans readfile => message<br />';
};
// Passage de error_reporting à 0 (rien).
error_reporting(0);
echo '<b>error_reporting = 0</b><br />';
// Lecture d'un fichier qui n'existe pas.
if (! readfile('/tmp/infos.txt')) {
echo 'Erreur dans readfile => plus de message<br />';
};
?>


Résultat

error_reporting = 32759
= E_ALL - E_NOTICE = 32759
$x (non initialisée) = => pas de message
error_reporting = E_ALL
Notice: Undefined variable: x in /app/scripts/index.php on line 20
$x (non initialisée) = => message
Warning: readfile(/tmp/infos.txt): failed to open stream:
No such file or directory in /app/scripts/index.php on line 22
Erreur dans readfile => message
error_reporting = 0
Erreur dans readfile => plus de message


En général, une fois en production, il est conseillé de désactiver l'affichage des messages d'erreur (soit par une directive de configuration, soit par un appel à error_reporting(0) au début de chaque script pour être indépendant de la configuration). Cette inhibition des messages d'erreur, justifiée d'une part pour des raisons de sécurité (les messages d'erreur PHP révèlent des informations sur l'arborescence du serveur), permet également d'afficher soi-même des messages propres.