English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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é.
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'erreur | Valeur | Description |
---|---|---|
E_ERROR | 1 | Erreur de temps d'exécution mortelle, impossible à récupérer. L'exécution du script sera immédiatement arrêtée. |
E_WARNING | 2 | 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_NOTICE | 8 | 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_ERROR | 256 | 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_WARNING | 512 | Avertissement 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_NOTICE | 1024 | 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_STRICT | 2048 | 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_ALL | 8191 | 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 :
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.
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ètres | Description |
---|---|
Obligatoire - Les paramètres suivants sont obligatoires | |
errno | Spécifiez le niveau d'erreur sous forme d'entier. Cela correspond aux constantes de niveau d'erreur appropriées (E_ERROR, E_WARNING, etc.) |
errstr | Spécifiez le message d'erreur sous forme de chaîne |
Optionnel - Les paramètres suivants sont optionnels | |
errfile | Spécifiez le nom du fichier de script où l'erreur s'est produite sous forme de chaîne |
errline | Spécifiez le numéro de ligne où l'erreur s'est produite sous forme de chaîne |
errcontext | Spé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); ?>
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é."; ?>
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é."; ?>
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.