PHP Gestion des erreurs


En PHP, la gestion des erreurs par défaut est simple. Un message d'erreur est envoyé au navigateur, contenant le nom du fichier, le numéro de ligne et un message décrivant l'erreur.


Gestion des erreurs PHP

La gestion des erreurs est un élément important lors de la création de scripts et d'applications web. Si votre code manque de code de détection d'erreurs, le programme paraît peu professionnel et ouvre la porte à des risques de sécurité.

Ce tutoriel présente certaines des méthodes de détection d'erreurs les plus importantes en PHP.

Nous allons vous expliquer différentes méthodes de gestion des erreurs :

  • Instructions simples "die()"
  • Erreurs personnalisées et déclencheurs d'erreurs
  • Rapport d'erreurs

Gestion de base des erreurs : utilisation de la fonction die()

Le premier exemple montre un script simple qui ouvre un fichier texte :

<?php
$file=fopen("welcome.txt","r");
?>

Si le fichier n'existe pas, vous obtiendrez une erreur comme celle-ci :

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in /www/example/test/test.php on line 2

Pour éviter que les utilisateurs obtiennent un message d'erreur comme celui ci-dessus, nous vérifions si le fichier existe avant d'y accéder :

<?php
if(!file_exists("welcome.txt"))
{
    die("文件不存在");
}
else
{
    $file=fopen("welcome.txt","r");
}
?>

Maintenant, si le fichier n'existe pas, vous obtiendrez un message d'erreur comme celui-ci :

File does not exist.

Par rapport au code précédent, le code ci-dessus est plus efficace, car il utilise un mécanisme simple de gestion des erreurs pour terminer le script après une erreur.

Toutefois, terminer simplement le script n'est pas toujours l'approche appropriée. Examinons les fonctions PHP alternatives utilisées pour gérer les erreurs.


Création d'un gestionnaire d'erreurs personnalisé

Créer un gestionnaire d'erreurs personnalisé est très simple. Nous créons simplement une fonction dédiée qui peut être appelée lorsqu'une erreur se produit en PHP.

La fonction doit pouvoir gérer au moins deux paramètres (niveau d'erreur et message d'erreur), mais elle peut accepter jusqu'à cinq paramètres (facultatifs : fichier, numéro de ligne et contexte d'erreur) :

Syntaxe

error_function(error_level,error_message,
error_file,error_line,error_context)
Paramètre Description
error_level Requis. Spécifie le niveau de rapport d'erreur pour l'erreur définie par l'utilisateur. Doit être un nombre. Voir le tableau ci-dessous : Niveaux de rapport d'erreur.
error_message Requis. Spécifie le message d'erreur pour l'erreur définie par l'utilisateur.
error_file Optionnel. Spécifie le nom du fichier dans lequel l'erreur s'est produite.
error_line Facultatif. Spécifie le numéro de ligne où l'erreur s'est produite.
error_context Facultatif. Spécifie un tableau contenant chaque variable et leurs valeurs utilisées lorsque l'erreur s'est produite.

Niveaux de rapport d'erreurs

Ces niveaux de rapport d'erreur sont les différents types d'erreurs gérés par le gestionnaire d'erreurs défini par l'utilisateur :

Valeur Constante Description
2 E_WARNING Erreurs d'exécution non fatales. N'arrêtent pas l'exécution du script.
8 E_NOTICE Notifications d'exécution. Se produisent lorsque le script détecte une erreur possible, mais peuvent également se produire lorsque le script s'exécute normalement.
256 E_USER_ERROR Erreurs fatales générées par l'utilisateur. Elles sont similaires à E_ERROR défini par le programmeur à l'aide de la fonction PHP trigger_error().
512 E_USER_WARNING Avertissements non fatals générés par l'utilisateur. Ils sont similaires à E_WARNING défini par le programmeur à l'aide de la fonction PHP trigger_error().
1024 E_USER_NOTICE Avis générés par l'utilisateur. Ils sont similaires à E_NOTICE défini par le programmeur à l'aide de la fonction PHP trigger_error().
4096 E_RECOVERABLE_ERROR Erreurs fatales capturables. Similaires à E_ERROR, mais peuvent être capturées par un gestionnaire défini par l'utilisateur. (Voir set_error_handler())
8191 E_ALL Toutes les erreurs et tous les avertissements. (Dans PHP 5.4, E_STRICT fait partie de E_ALL.)

Maintenant, créons une fonction qui gère les erreurs :

function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "脚本结束";
    die();
}

Le code ci-dessus est une simple fonction de gestion des erreurs. Lorsqu'elle est déclenchée, elle prend le niveau d'erreur et le message d'erreur. Ensuite, elle affiche le niveau d'erreur et le message, puis termine le script.

Maintenant que nous avons créé une fonction de gestion des erreurs, nous devons déterminer quand déclencher cette fonction.


Définition du gestionnaire d'erreurs

Le gestionnaire d'erreurs par défaut de PHP est le gestionnaire d'erreurs intégré. Nous avons l'intention de transformer la fonction ci-dessus en gestionnaire d'erreurs par défaut pendant l'exécution du script.

Le gestionnaire d'erreurs peut être modifié afin de ne s'appliquer qu'à certaines erreurs, ce qui permet au script de gérer différentes erreurs de différentes manières. Cependant, dans cet exemple, nous avons l'intention d'utiliser notre gestionnaire d'erreurs personnalisé pour toutes les erreurs :

set_error_handler("customError");

Comme nous voulons que notre fonction personnalisée gère toutes les erreurs, set_error_handler() n'a besoin que d'un seul paramètre. Un second paramètre peut être ajouté pour spécifier le niveau d'erreur.

Exemple

Testez ce gestionnaire d'erreurs en tentant d'afficher une variable qui n'existe pas :

<?php
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr";
}

// 设置错误处理函数
set_error_handler("customError");

// 触发错误
echo($test);
?>

La sortie du code ci-dessus est affichée ci-dessous :

Error: [8] Undefined variable: test


Déclenchement d'erreurs

Aux endroits du script où des données utilisateur sont saisies, il est utile de déclencher des erreurs lorsque la saisie de l'utilisateur est invalide. En PHP, cette tâche est effectuée par la fonction trigger_error().

Exemple

Dans cet exemple, une erreur se produit si la variable "test" est supérieure à "1" :

<?php
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1");
}
?>

La sortie du code ci-dessus est affichée ci-dessous :

Notice: 变量值必须小于等于 1
in /www/test/example.php on line 5

Vous pouvez déclencher des erreurs n'importe où dans votre script. En ajoutant le deuxième paramètre, vous pouvez spécifier le type d'erreur à déclencher.

Types d'erreur possibles :

  • E_USER_ERROR - Erreur d'exécution fatale générée par l'utilisateur. Cette erreur est irrécupérable. L'exécution du script est interrompue.
  • E_USER_WARNING - Avertissement d'exécution non fatal généré par l'utilisateur. L'exécution du script n'est pas interrompue.
  • E_USER_NOTICE - Par défaut. Note d'exécution générée par l'utilisateur. Se produit lorsque le script détecte une erreur possible, mais peut aussi se produire lorsque le script s'exécute normalement.

Exemple

Dans cet exemple, une erreur E_USER_WARNING se produit si la variable "test" est supérieure à "1". Si une E_USER_WARNING se produit, nous utiliserons notre gestionnaire d'erreurs personnalisé et terminerons le script :

<?php
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "脚本结束";
    die();
}

// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);

// 触发错误
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>

La sortie du code ci-dessus est affichée ci-dessous :

Error: [512] 变量值必须小于等于 1
脚本结束

Maintenant que nous avons appris à créer nos propres erreurs et à les déclencher, passons maintenant à la journalisation des erreurs.


Journalisation des erreurs

Par défaut, selon la configuration error_log dans php.ini, PHP envoie les journaux d'erreurs au système de journalisation du serveur ou dans un fichier. En utilisant la fonction error_log(), vous pouvez envoyer les journaux d'erreurs vers un fichier spécifié ou une destination distante.

S'envoyer des messages d'erreur par e-mail est un bon moyen d'être averti d'erreurs spécifiques.

Envoi de messages d'erreur par e-mail

Dans l'exemple suivant, si une erreur spécifique se produit, nous enverrons un e-mail contenant le message d'erreur et mettrons fin au script :

<?php
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "已通知网站管理员";
    error_log("Error: [$errno] $errstr",1,
    "[email protected]","From: [email protected]");
}

// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);

// 触发错误
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>

La sortie du code ci-dessus est affichée ci-dessous :

Error: [512] 变量值必须小于等于 1
已通知网站管理员

L'e-mail reçu à partir du code ci-dessus est présenté ci-dessous :

Error: [512] 变量值必须小于等于 1

Cette méthode ne convient pas à toutes les erreurs. Les erreurs ordinaires doivent être journalisées sur le serveur à l'aide du système de journalisation PHP par défaut.

Autres extensions