Gestion des erreurs en PHP
1) Présentation des erreurs PHP
Afin de pouvoir différencier les différentes erreurs pouvant survenir à l'exécution d'un script, PHP dispose de neuf types d'erreurs qui seront présentés dans la première partie de ce chapitre. Le but de la seconde partie est de vous expliquer comment influer sur le comportement du parseur PHP si un problème survient.
1.1) Les différents niveaux d'erreurs
Chacun de ces neuf types d'erreur est une constante prédéfinie de PHP dont la valeur est un entier. En voilà la description :
E_NOTICE
Le type E_NOTICE correspond à une erreur non fatale causée quand quelque chose d'anormal survient pendant l'exécution d'un script telle une référence à une variable non définie qui peut indiquer un bug.
Cette erreur n'est par défaut pas rapportée car qu'elle peut être générée pendant l'exécution normale d'un script.
E_WARNING
Le type E_WARNING correspond également une erreur non fatale provoquée par des problèmes que le script aurait lui-même dû empêcher (exemple : passage de paramètres de types incorrects à une fonction). Bien que ces erreurs n'empêchent pas l'exécution du script, elles sont assez sérieuses pour être signalées par défaut à l'utilisateur et pour être prise en compte par le développeur.
E_ERROR
Le type E_ERROR est le premier type d'erreur considéré comme une erreur fatale et indique un problème que PHP n'a pas pu résoudre de lui-même. Les erreurs E_ERROR sont indiquées par défaut. En outre, ces erreurs doivent stopper l'exécution du script.
E_PARSE
Une erreur de type E_PARSE est produite par le parseur PHP et signifie généralement qu'une erreur de syntaxe a été rencontrée dans le code source.
Cette erreur est fatale et met fin à l'exécution du script.
E_CORE_ERROR
Le type E_CORE_ERROR est identique au type E_ERROR. Cependant, la source de l'erreur n'est pas le code source mais le noyau PHP.
En raison, des similitudes avec le type E_ERROR, il peut être intéressant de les gérer de manière identique.
E_CORE_WARNING
Comme pour E_CORE_ERROR, E_CORE_WARNING est le pendant de E_WARNING pour les warnings générés par le moteur PHP.
A traiter comme les erreurs de type E_WARNING.
E_COMPILE_ERROR
Les erreurs E_COMPILE_WARNING sont elles aussi générées par le Zend Engine. Elle peuvent être traitées comme les erreurs E_WARNING et E_CORE_WARNING.
E_ALL
E_ALL n'est pas vraiment un type d'erreur mais un regroupement de tous les types précédents. Sa valeur est la somme de toutes les constantes correspondant aux types ci-dessus.
1.2) Configuration du fichier php.ini
Il est possible d'influencer le comportement par défaut de PHP pour la gestion des erreurs dans le fichier php.ini.
Sous Microsoft Windows, vous le trouverez dans le répertoire de Windows (x:\windows pour Windows 9x/Me/XP, x:\winnt pour Windows NT4/2000/2003).
Si vous exécutez un système d'exploitation à base d'Unix (GNU/Linux, FreeBSD ...), tout dépend de la manière dont vous avez installé PHP (compilation à partir des sources, binaires).
Ce fichier pour Debian SID (la plateforme qui a servi à la rédaction de cet article) se trouve dans le répertoire /etc/php4/apache dans le cas d'une installation à partir des binaires.
Les options de configuration des erreurs débutent environ à la ligne 235 du fichier. C'est la section nommée Error handling and logging. Nous allons donc étudier une à une ces directives.
error_reporting
Cette première option permet de définir quelles vont être les erreurs qui seront affichées. Vous pouvez la renseigner en utilisant les types d'erreurs présentés ci-dessus et en utilisant les opérateurs bits à bits & (ET), | (OU), ~ (SAUF), de même que l'opérateur booléen ! (SAUF).
Exemple 1 :
par défaut PHP affiche toutes les erreurs sauf les E_NOTICE
Cela donne : E_ALL & ~E_NOTICE
Exemple 2 :
vous voulez n'afficher que les erreurs dites fatales
Cela se traduit par : E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR
display_errors
Cette option vous permet d'afficher ou non les erreurs à l'écran. Sa valeur peut être On (afficher) ou Off (ne pas afficher).
Conseil d'utilisation :
Pour le développement de votre site Web, mettez cette option à On.
Dans le cas d'un site en production, désactivez la.
log_errors
La valeur de cette option permet d'enregistrer les erreurs dans un fichier par le biais des commutateurs On et Off. Le nom du fichier est précisé plus bas dans le fichier par la directive error_log.
Conseil d'utilisation :
Dans le cas d'un site en production, activez cette option plutôt que d'afficher les erreurs.
log_errors_max_len
Cette directive permet de spécifier la longueur maximale d'un enregistrement d'erreurs. Sa valeur est à spécifier en octets. Pour ne pas restreindre la longueur, renseignez la avec la valeur 0.
ignore_repeated_errors
Renseignez cette option à On si vous ne souhaitez pas qu'une même erreur (même fichier source, même ligne) soit enregistrée. Pour désactiver cette option, la valeur est Off.
ignore_repeated_source
Cette option permet de décider si on doit éviter d'enregistrer les erreurs provenant du même fichier source.
Elle va de pair avec la précédente qui ne sera effective si et seulement si celle-ci est activée.
report_memleaks
Ce paramètre a pour objet d'indiquer ou pas les fuites de mémoire qui peuvent survenir au cours de l'exécution d'un script.
Pour être effectif, la valeur de l'option error_reporting doit être configuré pour afficher les erreurs de type E_WARNING.
track_errors
Si cette option a pour valeur On, l'intitulé du dernier message d'erreur sera stocké dans la variable .
html_errors
Cette option permet d'ajouter ou non du code HTML dans les messages d'erreurs. Pour cela, elle accepte les valeurs On et Off.
docref_root et docref_ext
Ces deux options ne sont valides que si html_errors est mise à On.
PHP peut générer des liens vers la documentation de la fonction qui a causé l'erreur.
docref_root permet de définir l'emplacement de la documentation PHP et docref_ext permet d'indiquer l'extention des fichiers de documentation.
Exemple :
Supposons que vous ayez téléchargé la documentation sur le site officiel PHP et placé celle-ci dans le répertoire php_doc à la racine de votre serveur web
docref_root = '/php_doc/'
docref_ext = .html
error_prepend_string et error_append_string
Ces 2 paramètres donnent la possibilité d'ajouter une chaîne de caractère au début du message d'erreur (error_prepend_string) et à la fin (error_append_string).
Cette chaîne de caractères peut très bien être du code HTML.
Exemple :
vous voulez que l'erreur apparaisse en rouge et en gras avec la police Courier new
error_prepend_string = "<font color='red' face='Courier New'><b>"
error_append_string = "</b></font>";
error_log
Grâce à cette option, vous pouvez spécifier où vous souhaitez enregistré l'historique des erreurs survenues. Pour ça, deux possibilités :
- indiquez soit le nom d'un fichier (exemple : /var/log/php/php_errors.log)
- indiquez syslog pour que l'erreur soit enregistrée dans les logs système.
Nous voici arrivé à la fin de ce premier chapitre ... Passons maintenant à la gestion basique des erreurs en PHP à l'intérieur de vos scripts.