Interception erreurs et mail
Bonjour.
J'ai défini un même gestionnaire d'erreur et d'exception, gerer_plantage(), qui me permet de logger l'événement dans un fichier et d'envoyer un mail à l'administrateur pour l'informer du plantage. Le mail est envoyé via une fonction envoyer_mail() qui permet de formater les messages pour l'ensemble du site.
Je constate les choses suivantes :
- lorsque la fonction standard mail(), utilisée par envoyer_mail(), plante (ex : impossible de contacter le serveur SMTP), une erreur est générée ;
- l'erreur est bien récupérée par le gestionnaire, qui écrit dans le fichier de logs ;
- la fonction envoyer_mail() ne semble pas appelée par le gestionnaire pour informer l'administrateur.
La troisième constatation est-elle normale ? S'explique-t-elle par le fait que PHP ne rappelle pas une fonction ayant généré une erreur ?
Pour éviter une boucle en cas de plantage de envoyer_mail(), j'ai bien tenté l'interception d'une exception (cf. code ci-après), qui ne fonctionne pas puisqu'il s'agit d'une erreur. A part traiter les exceptions et les erreurs de manière séparée, voyez-vous une autre solution ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| function gerer_plantage($Code, $Message, $Fichier, $Ligne, $Contexte=array()) {
/* Gestion des plantages (erreurs et exceptions)
/* Prend en arguments :
/* - $Code, le code du plantage (entier)
/* - $Message, le message décrivant le plantage (chaîne)
/* - $Fichier, le fichier ayant géneré le plantage (chaîne)
/* - $Ligne, la ligne où s'est produit le plantage (entier)
/* - $Contexte, le contexte lors du plantage (tableau)
/* Renvoie true si tout s'est bien passé, false sinon. */
/* Ecriture du message d'erreur dans les logs */
ecrire_log("Plantage n°$Code \"$Message\" à la ligne $Ligne", "E", basename($Fichier));
/* Envoi d'un mail à l'administrateur */
$Sujet = "Plantage n°$Code";
$Message = "Plantage n°$Code \"$Message\" à la ligne $Ligne dans le fichier $Fichier";
try {
if (envoyer_mail($Sujet, $Message, DESTINATAIRE_MAILS_ERR)) {
return true;
} else {
print formater_message("Echec lors de la gestion de l'erreur. Merci de prévenir l'administrateur à l'adresse " . DESTINATAIRE_MAILS_ERR . ".", "E");
return false;
}
} catch (Exception $Excep) {
print formater_message("Echec lors de la gestion de l'erreur. Merci de prévenir l'administrateur à l'adresse " . DESTINATAIRE_MAILS_ERR . ".", "E");
return false;
}
} |