English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP Basic Tutorial

PHP Advanced Tutorial

PHP & MySQL

PHP Reference Manual

Gestion des erreurs PHP

Dans ce tutoriel, vous apprendrez à utiliser les fonctionnalités de gestion des erreurs de PHP pour gérer les situations d'erreur de manière élégante.

Gérer les erreurs

Parfois, votre application ne peut pas fonctionner correctement, ce qui entraîne des erreurs. Il existe plusieurs raisons possibles pour cela, par exemple :

  • Le serveur web peut manquer d'espace disque

  • L'utilisateur peut avoir entré une valeur invalide dans un champ de formulaire

  • Le fichier ou l'enregistrement de base de données que vous essayez d'accéder peut ne pas exister

  • L'application peut ne pas avoir les permissions nécessaires pour écrire sur le disque

  • Les services auxquels l'application a besoin d'accéder peuvent être temporairement indisponibles

Ces types d'erreurs sont appelés erreurs de temps d'exécution car elles se produisent pendant l'exécution du script. Elles diffèrent des erreurs de syntaxe qui doivent être corrigées avant l'exécution du script.

Les applications professionnelles doivent disposer de fonctionnalités appropriées pour gérer ces erreurs de temps d'exécution. Cela signifie généralement informer plus clairement et plus précisément l'utilisateur de ce qui s'est passé.

Comprendre les niveaux d'erreur

Généralement, lorsqu'un problème apparaît qui empêche le script de fonctionner correctement, le moteur PHP déclenche une erreur. Chaque erreur est représentée par une valeur entière et une constante associée. Le tableau suivant liste quelques niveaux d'erreur courants :

Niveau d'erreurValeurDescription
E_ERROR1

Erreur de temps d'exécution mortelle, impossible à récupérer. L'exécution du script sera immédiatement arrêtée.

E_WARNING2

Avertissement de temps d'exécution. Il n'est pas fatal, la plupart des erreurs appartiennent à cette catégorie. L'exécution du script ne sera pas interrompue.

E_NOTICE8

Notification de temps d'exécution. Indique que le script a rencontré une situation susceptible de générer une erreur, bien que cela puisse également se produire lors de l'exécution normale du script.

E_USER_ERROR256

Message d'erreur fatal généré par l'utilisateur. Cela ressemble à E_ERROR, mais il est généré par le script PHP à l'aide de la fonction trigger_error() plutôt que par le moteur PHP.

E_USER_WARNING512Avertissement généré par l'utilisateur non fatal. Cela ressemble à E_WARNING, mais il est généré par le script PHP à l'aide de la fonction trigger_error() plutôt que par le moteur PHP.
E_USER_NOTICE1024

Message de notification généré par l'utilisateur. Cela ressemble à E_NOTICE, mais il est généré par le script PHP à l'aide de la fonction trigger_error() plutôt que par le moteur PHP.

E_STRICT2048

En règle générale, ce n'est pas une erreur, mais PHP déclenche un événement chaque fois qu'il rencontre un code susceptible de poser des problèmes ou d'être incompatible avec les versions antérieures.

E_ALL8191

Toutes les erreurs et les avertissements, PHP 5.4.0 avant E_STRICT.

Pour plus d'informations sur les niveaux d'erreur, veuillez consulterNiveaux d'erreurs PHPde référence.

Chaque fois que le moteur PHP rencontre un problème, il déclenche une erreur, mais vous pouvez également déclencher une erreur vous-même pour générer des messages d'erreur plus conviviaux pour l'utilisateur. De cette manière, vous pouvez rendre l'application plus complexe. La partie suivante décrit quelques méthodes couramment utilisées pour traiter les erreurs PHP :

Gestion des erreurs de base avec la fonction die()

Considérez l'exemple suivant, qui tente simplement d'ouvrir un fichier texte en lecture seule.

<?php
//Essayer d'ouvrir un fichier inexistant
$file = fopen("sample.txt", "r");
?>

Si le fichier n'existe pas, vous pourriez recevoir l'erreur suivante :

Avertissement : fopen(sample.txt) [fonction.fopen] : échec de l'ouverture du flux : Aucun fichier ou répertoire trouvé dans C:\wamp\www\project\test.php en ligne 2

En suivant quelques étapes simples, nous pouvons éviter que l'utilisateur reçoive de tels messages d'erreur.

<?php
if(file_exists("sample.txt")){
    $file = fopen("sample.txt", "r");
} else {
    die("Erreur : Le fichier que vous essayez d'accéder n'existe pas.");
}
?>

Maintenant, si vous exécutez le script ci-dessus, vous obtiendrez le message d'erreur suivant :

Erreur : Le fichier que vous essayez d'accéder n'existe pas.

Comme vous pouvez le voir, en effectuant une simple vérification de l'existence du fichier avant d'essayer d'y accéder, nous pouvons générer des messages d'erreur plus significatifs pour l'utilisateur.

Si le fichier "sample.txt" n'est pas trouvé, la fonction die() utilisée ci-dessus affiche simplement un message d'erreur personnalisé et arrête le script en cours.

Créer une fonction de gestion des erreurs personnalisée

Vous pouvez créer votre propre fonction de gestion des erreurs pour traiter les erreurs d'exécution générées par le moteur PHP. La fonction de gestion des erreurs personnalisée vous offre une plus grande flexibilité et un meilleur contrôle sur les erreurs, elle peut vérifier les erreurs et décider de la manière de les traiter, elle peut afficher un message à l'utilisateur, enregistrer l'erreur dans un fichier ou une base de données, ou l'envoyer par e-mail, essayer de réparer le problème et continuer, quitter l'exécution du script ou ignorer l'erreur complètement.
La fonction de gestion des erreurs personnalisée doit être capable de gérer au moins deux paramètres (errno et errstr), mais elle peut également accepter trois autres paramètres (errfile, errline et errcontext), comme décrit ci-dessous :

ParamètresDescription
Obligatoire - Les paramètres suivants sont obligatoires
errnoSpécifiez le niveau d'erreur sous forme d'entier. Cela correspond aux constantes de niveau d'erreur appropriées (E_ERROR, E_WARNING, etc.)
errstrSpécifiez le message d'erreur sous forme de chaîne
Optionnel - Les paramètres suivants sont optionnels
errfileSpécifiez le nom du fichier de script où l'erreur s'est produite sous forme de chaîne
errlineSpécifiez le numéro de ligne où l'erreur s'est produite sous forme de chaîne
errcontextSpécifiez un tableau contenant toutes les variables existantes et leurs valeurs au moment de l'erreur. Utile pour le débogage

Voici un exemple simple de fonction de gestion des erreurs personnalisée. Quelle que soit son importance, dès qu'une erreur se produit, ce gestionnaire customError() est déclenché. Ensuite, les détails de l'erreur sont affichés dans le navigateur et l'exécution du script est arrêtée.

<?php
//Fonction de gestion des erreurs
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}
?>

Vous devez indiquer à PHP d'utiliser votre fonction de gestion des erreurs personnalisée-Il suffit de appeler la fonction intégrée set_error_handler() et de passer le nom de la fonction en tant que paramètre.

<?php
//Fonction de gestion des erreurs
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}
 
//Définir un gestionnaire d'erreurs
set_error_handler("customError");
 
//Déclencher une erreur
echo($test);
?>

Enregistrement des erreurs

Enregistrer les messages d'erreur dans un fichier texte

Vous pouvez également enregistrer les détails des erreurs dans un fichier de journal, comme suit :

<?php
function calcDivision($dividend, $divisor) {
    if($divisor == 0) {
        trigger_error("calcDivision() : Le diviseur ne peut pas être zéro", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    Le message .= "Erreur : [" . $errno . "], ". ". $errstr dans $errfile à la ligne $errline;"
    $message .= "Variables:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 3, "logs"/app_errors.log
    die("Un problème est survenu, veuillez réessayer.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "Ce texte ne sera jamais affiché.";
?>

Envoyer des messages d'erreur par e-mail

Vous pouvez également utiliser la fonction error_log() pour envoyer un e-mail avec des détails d'erreur.

<?php
function calcDivision($dividend, $divisor) {
    if ($divisor == 0){
        trigger_error("calcDivision() : Le diviseur ne peut pas être zéro", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    Le message .= "Erreur : [" . $errno . "], ". ". $errstr dans $errfile à la ligne $errline;"
    $message .= "Variables:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 1, "[email protected]");
    die("Un problème est survenu, veuillez réessayer. Un rapport d'erreur a été soumis à l'administrateur du site.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "Cela ne sera jamais affiché.";
?>

Déclencher une erreur

Bien que le moteur PHP déclenche des erreurs lorsqu'il rencontre des problèmes dans le script, vous pouvez également déclencher des erreurs vous-même. Cela peut aider à rendre votre application plus robuste, car elle peut marquer des problèmes potentiels avant qu'ils ne deviennent des erreurs graves.

Pour déclencher une erreur à partir du script, appellez la fonction trigger_error() et transmettez le message d'erreur à générer :

trigger_error("Un problème est survenu.");

Considérez la fonction suivante pour calculer la division de deux nombres :

<?php
function calcDivision($dividend, $divisor) {
    return($dividend / $divisor);
}
 
//Appel de la fonction
echo calcDivision(10, 0);
?>

Si vous passez une valeur nulle en tant que paramètre $divisor, le message d'erreur généré par le moteur PHP sera similaire au contenu suivant :

Attention : division par zéro dans C:\wamp\www\project\test.php à la ligne 3

Ce message semble ne pas contenir beaucoup d'informations. Voici un exemple de génération d'erreur utilisant la fonction trigger_error() :

<?php
function calcDivision($dividend, $divisor) {
    if($divisor == 0) {
        trigger_error("Le diviseur ne peut pas être zéro", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
 
//Appel de la fonction
echo calcDivision(10, 0);
?>

Maintenant, le script génère ce message d'erreur :

Attention : le diviseur ne peut pas être zéro dans C:\wamp\www\project\error.php à la ligne 4  	

Comme vous le voyez, le message d'erreur généré par le second exemple explique plus clairement le problème par rapport à l'exemple précédent.