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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }







Répondre avec citation



Partager