Le langage PHP possède, comme tous les autres, une structure permettant de gérer les erreurs.
Lors des phases de développement, les messages d’erreurs sont des indicateurs qui permettent de savoir comment, où et pourquoi le script ne fonctionne pas.

Les 3 types d’erreurs en PHP

  • Notices : Erreurs non critiques, ne bloquant pas le script. Aucune information n’est affichée.
  • Warnings : Erreurs non critiques. L’erreur est affichée, mais le script est exécuté jusqu’à la fin.
  • Fatal errors : Erreurs critiques bloquant le script. Seule l’erreur est affichée.

Parmi ces types d’erreurs, il y a des niveaux permettant de mieux définir la cause. La liste de ces niveaux (« predefined constants ») est disponible sur le site officiel de PHP.

Composition d’une erreur

Une erreur affichée est composée de son type, d’une brève explication, du fichier et de la ligne dans lesquels elle se trouve.

composition d'une erreur en PHP

Gestion des erreurs

Ne pas afficher les erreurs

Les erreurs sont très utiles lors des phases de développement, mais beaucoup moins une fois celui-ci achevé.
Je me répète sans doute, mais lors de la mise en production, il est fortement conseillé de ne pas afficher les erreurs afin de ne pas donner d’indices sur la configuration d’environnement.
Pour ne pas afficher d’erreur, on peut utiliser ces méthodes :

  • Si le fichier de configuration serveur (php.ini) est accessible en écriture :
    ini_set("display_errors", false);
  • Sinon :
    error_reporting(0);
  • Si on veut ne pas afficher l’erreur d’une fonction, on ajoute @ avant la fonction :
    @maFonction()
  • Si on veut supprimer l’affiche d’erreurs PHP dans tous le site, on rajoute ces lignes au fichier .htaccess :
    php_flag display_startup_errors off
    php_flag display_errors off
    php_flag html_errors off
    php_value docref_root 0
    php_value docref_ext 0

Gérer les erreurs à afficher en fonction de leur type

Il est possible de gérer les erreurs à afficher en utilisant le tableau des niveaux d’erreurs. Il suffit de repérer dans ce dernier le nom du niveau puis d’utiliser la fonction correspondante. Par exemple :

error_reporting(E_NOTICE|E_USER_NOTICE|);

Cette ligne n’affichera alors que les erreurs Notices.

Modifier le comportement du gestionnaire d’erreurs

Par défaut, lors de l’apparition d’une erreur, le serveur doit soit afficher le message d’erreur, soit s’abstenir.
Mais il est possible de lui faire effectuer l’action de notre choix : écrire l’erreur dans un journal ou dans une base de données, envoyer un mail…
Pour modifier le comportement du gestionnaire d’erreurs, on va utiliser la fonction : set_error_handler()
Cette dernière va prendre en argument le nom d’une fonction personnalisée et remplacer le comportement à adopter lors d’une erreur.
Un petit exemple vaut mieux qu’un long discours :

//On crée la fonction avant de l'utiliser
//les variables sont respectivement : type d'erreur, message explicatif, dans quel fichier et à quelle ligne

fonction erreur_perso($errno, $errstr, $errfile, $errline){


//On peut dès maintenant utiliser les variables telles quelles

echo 'une erreur de type '.$errno.' est apparue car '.$errstr.' lors de l\'exécution du fichier '.$errfile.' ligne '.$errline;
}

Ce n’est qu’un exemple pour vous montrer que maintenant on a accès aux données.
On peut très bien appliquer un comportement différent en fonction du type d’erreur.
Il reste à demander au gestionnaire d’erreurs d’utiliser la fonction :

set_error_handler(erreur_perso);

Le seul point noir du gestionnaire d’erreurs de base ou personnalisé vient du fait que les erreurs fatales sont bloquantes et leur exécution arrête le script, quoi qu’on fasse.
La seule méthode contre les erreurs bloquantes est de les prévoir et de ne pas les exécuter. C’est l’objet du prochain paragraphe.

Prévoir une erreur bloquante

Le principe est de tester un script dont on sait qu’il est critique et a une probabilité aléatoire de générer une erreur fatale.
Le test va scanner le script sans l’exécuter et va générer une Exception (objet $e). Si une erreur se produit, il nous reste à lire l’objet pour découvrir l’erreur.

try{fonctionCritique()}
//On attrape l'erreur qu'on peut analyser avec l'objet $e généré
catch (Exception $e){
echo 'L\'erreur '.$e->getMessage().' est survenue !';
}

L’objet exception ($e) possède ces fonctions d’affichage d’information :

  • getMessage: retourne le message d’erreur
  • getPrevious: retourne l’objet exception avant la présente erreur
  • getCode: type de l’erreur
  • getFile: fichier du provenance de l’erreur

 

Voilà, je vous ai dit tout ce que je sais sur les erreurs en PHP. Si vous en connaissez plus, n’hésitez pas à commenter pour partager votre savoir !