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

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.
Une erreur affichée est composée de son type, une brève explication, dans quel fichier et au niveau de quelle ligne l’erreur a été exécutée.

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 le sont beaucoup moins une fois le développement 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 :

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 ne pas afficher d’erreur 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 son type

Il est possible de gérer les erreurs à afficher en utilisant le tableau des niveaux d’erreurs pour retrouver le nom du niveau puis d’utiliser la fonction :

error_reporting(E_NOTICE|E_USER_NOTICE|);

Ainsi cette ligne ne va afficher que les erreurs Notices.

Modifier le comportement du gestionnaire d’erreurs

Par défaut, lors de l’apparition d’une erreur, le serveur doit afficher le message d’erreur ou s’abstenir.
Mais il est possible de lui faire effectuer ce que l’on veut comme un événement.
Écrire l’erreur dans un journal ou dans une base de données, envoyer un mail, bref tout ce que l’on souhaite.
Pour modifier le comportement du gestionnaire d’erreurs, on va utiliser la fonction : set_error_handler()
Cette fonction va prendre en argument le nom d’une fonction personnalisée afin de 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 tels 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 à dire au gestionnaire d’erreur d’utiliser ma fonction :

set_error_handler(erreur_perso);

Le seul point noir du gestionnaire d’erreur de base ou personnalisé vient du fait que les erreurs fatales sont bloquantes et leurs exécutions arrête le script quoi qu’on fasse.
La seule méthode contre les erreurs bloquantes est de les prévoir et 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 vos connaissances !