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;
	}
}