Subversion Repositories Applications.framework

Rev

Rev 194 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 194 Rev 342
Line 2... Line 2...
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Classe de gestion des exceptions.
4
 * Classe de gestion des exceptions.
5
 * C'est un Singleton.
5
 * C'est un Singleton.
6
 *
6
 *
7
 * PHP Version 5
-
 
8
 *
-
 
9
 * @category  Class
7
 * @category	PHP 5.2
10
 * @package   Framework
8
 * @package	Framework
11
 * @author	aurelien <aurelien@tela-botanica.org>
9
 * @author		Aurélien PERONNET <aurelien@tela-botanica.org>
-
 
10
 * @author		Jean-Pascal MILCENT <jmp@tela-botanica.org>
12
 * @copyright 2009 Tela-Botanica
11
 * @copyright	Copyright (c) 2009, Tela Botanica (accueil@tela-botanica.org)
13
 * @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
12
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
14
 * @license   http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
13
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
15
 * @version   SVN: $$Id: GestionnaireException.php 194 2010-05-19 13:03:50Z jpm $$
14
 * @version	$Id: GestionnaireException.php 342 2011-06-06 13:58:53Z jpm $$
16
 * @link	  /doc/framework/
15
 * @link		/doc/framework/
17
 *
16
 *
18
 */
17
 */
19
class GestionnaireException {
18
class GestionnaireException {
Line 20... Line 19...
20
	
19
	
Line 52... Line 51...
52
		self::$contexte = Config::get('fw_debogage_contexte');
51
		self::$contexte = Config::get('fw_debogage_contexte');
53
		self::$logger = Config::get('fw_log_debogage');
52
		self::$logger = Config::get('fw_log_debogage');
54
		self::$afficher = Config::get('fw_debogage');
53
		self::$afficher = Config::get('fw_debogage');
55
	}
54
	}
Line -... Line 55...
-
 
55
	
-
 
56
	/**
-
 
57
	 * Renvoie le nombre d'exceptions et d'erreurs levées.
-
 
58
	 * @see getExceptions() pour obtenir les exceptions formatées.
-
 
59
	 * @since 0.3 
-
 
60
	 * @return int le nombre d'exception actuellement levées
-
 
61
	 */
-
 
62
	public static function getExceptionsNbre() {
-
 
63
		return count(self::$exceptions);
-
 
64
	}
-
 
65
	
56
	
66
	/** 
-
 
67
	 * Renvoie le booleen définissant si l'on affiche le contexte ou non 
-
 
68
	 * @return bool true si on affiche le contexte sinon false. 
57
	/** Renvoie le booleen définissant si l'on affiche le contexte ou non */
69
	 */
58
	public static function getContexte() {
70
	public static function getContexte() {
59
		return self::$contexte;
71
		return self::$contexte;
Line 60... Line 72...
60
	}
72
	}
Line 66... Line 78...
66
	public static function setContexte($contexte) {
78
	public static function setContexte($contexte) {
67
		self::$contexte = $contexte;
79
		self::$contexte = $contexte;
68
	}
80
	}
Line 69... Line 81...
69
 
81
 
70
	/**
82
	/**
-
 
83
	 * Fonction de gestion des exceptions, remplace le handler par défaut.
71
	 * Fonction de gestion des exceptions, remplace le handler par défaut
84
	 * Si une boucle génère de multiple exception (ou erreur) identique une seule sera stockée.
72
	 * @param Exception $e l'exception à traiter
85
	 * @param Exception $e l'exception à traiter
73
	 */
86
	 */
74
	public static function gererException(Exception $e) {
87
	public static function gererException(Exception $e) {
75
		// pour le moment on se contente de l'ajouter au tableau et de les afficher
88
		$cle = hash('md5', $e->getMessage().'-'.$e->getFile().'-'.$e->getLine());
76
		self::$exceptions[] = $e;
89
		if (!isset(self::$exceptions[$cle])) {
77
		// Log si nécéssaire
90
			self::$exceptions[$cle] = $e;
-
 
91
			self::loggerException($e);
78
		self::loggerException($e);
92
		}
Line 79... Line 93...
79
	}
93
	}
80
 
94
 
81
	/**
95
	/**
Line 88... Line 102...
88
	 */
102
	 */
89
	public static function gererErreur($niveau,  $message,  $fichier,  $ligne,  $contexte){
103
	public static function gererErreur($niveau,  $message,  $fichier,  $ligne,  $contexte){
90
		// Si un rapport d'erreur existe, création d'une exception
104
		// Si un rapport d'erreur existe, création d'une exception
91
		if (error_reporting() != 0) {
105
		if (error_reporting() != 0) {
92
			$e = new ErrorException($message, 0, $niveau, $fichier, $ligne);
106
			$e = new ErrorException($message, 0, $niveau, $fichier, $ligne);
93
			// que l'on donne au tableau d'exceptions
-
 
94
			self::$exceptions[] = $e;
-
 
95
			// Log si nécéssaire
-
 
96
			self::loggerException($e);			
107
			self::gererException($e);
97
		}
108
		}
98
		return null;
109
		return null;
99
	}
110
	}
Line 100... Line 111...
100
 
111
 
-
 
112
	/**
-
 
113
	 * Renvoie les exceptions au format (X)HTML ou bien au format texte suivant le mode d'utilisation de PHP.
-
 
114
	 * @since 0.3
101
	/**
115
	 * @deprecated
102
	 * Renvoie les exceptions au format (X)HTML
116
	 * @see getExceptionsFormatees()
103
	 * ou bien au format texte suivant le mode d'utilisation de PHP
117
	 * @return string les exceptions formatées en texte ou (X)HTML.
104
	 */
118
	 */
-
 
119
	public static function getExceptions() {
-
 
120
		return self::getExceptionsFormatees();
-
 
121
	}
-
 
122
	
-
 
123
	/**
-
 
124
	 * Renvoie les exceptions au format (X)HTML ou bien au format texte suivant le mode d'utilisation de PHP.
-
 
125
	 * @since 0.3
-
 
126
	 * @return string les exceptions formatées en texte ou (X)HTML.
-
 
127
	 */
105
	public static function getExceptions() {
128
	public static function getExceptionsFormatees() {
-
 
129
		$retour = '';
106
		$retour = '';
130
		if (self::getExceptionsNbre() > 0) {
107
		foreach (self::$exceptions as $cle => $e) {
131
			foreach (self::$exceptions as $cle => $e) {
108
			switch (self::$mode) {
132
				switch (self::$mode) {
109
				case self::MODE_CLI :
-
 
110
					$retour .= $e->getMessage()."\n";
-
 
111
					$retour .= 'Fichier : '.$e->getFile()."\n";
133
					case self::MODE_CLI :
112
					$retour .= 'Ligne : '.$e->getLine()."\n";
-
 
113
					if (self::getContexte()) {
-
 
114
						$retour .= 'Contexte : '."\n".print_r($e->getTraceAsString(), true)."\n";
-
 
115
					}
134
						$retour .= self::formaterExceptionTxt($e);
116
					break;
135
						break;
117
				default:
136
					default:
118
					$retour .= '<div class="debogage">'."\n";
-
 
119
					$retour .= $e->getMessage()."\n";
-
 
120
					$retour .= '<span class="debogage_fichier">'.'Fichier : '.$e->getFile().'</span>'."\n";
-
 
121
					$retour .= '<span class="debogage_ligne">'.'Ligne : '.$e->getLine().'</span>'."\n";
-
 
122
					if (self::getContexte()) {
-
 
123
						$retour .= '<pre>'."\n";
-
 
124
						$retour .= '<strong>Contexte : </strong>'."\n".print_r($e->getTraceAsString(), true)."\n";
-
 
125
						$retour .= '</pre>'."\n";
137
						$retour .= self::formaterExceptionXhtml($e);
-
 
138
				}
126
					}
139
				// Nous vidons le tableau des exceptions au fur et à mesure pour éviter le réaffichage avec le destructeur.
127
					$retour .= '</div>'."\n";
140
				unset(self::$exceptions[$cle]);
-
 
141
			}
-
 
142
		}
-
 
143
		return $retour;
-
 
144
	}
-
 
145
	
-
 
146
	/**
-
 
147
	 * Renvoie le tableau d'objets Exception générées par le script PHP triées du niveau de sévérité le plus élevé au moins élevé.
-
 
148
	 * Format du tableau :
-
 
149
	 * array{sévérité_1 = array{Exception1, Exception2, Exception3,...}, sévérité_1 =  array{Exception1, Exception2, ...}, ...};
-
 
150
	 * ATTENTION : si vous utilisez cette méthode, c'est à vous de gérer l'affichage des Exceptions. Le gestionnaire d'exception
-
 
151
	 * n'enverra plus rien au navigateur ou à la console.
-
 
152
	 * @since 0.3
-
 
153
	 * @return array le tableau trié d'objet Exception.
-
 
154
	 */
-
 
155
	public static function getExceptionsTriees() {
-
 
156
		$retour = array();
-
 
157
		if (self::getExceptionsNbre() > 0) {
-
 
158
			foreach (self::$exceptions as $cle => $e) {
128
			}
159
				$retour[$e->getSeverity()][] = $e;
129
			// Nous vidons le tableau des exceptions au fur et à mesure
160
				// Nous vidons le tableau des exceptions au fur et à mesure pour éviter le réaffichage avec le destructeur.
-
 
161
				unset(self::$exceptions[$cle]);
-
 
162
			}
130
			unset(self::$exceptions[$cle]);
163
			ksort($retour);
131
		}
164
		}
132
		return $retour;
165
		return $retour;
Line 133... Line 166...
133
	}
166
	}
134
 
167
 
135
	/**
168
	/**
136
	 * Logue une exception donnée sous une forme lisible si self::logger vaut true.
169
	 * Logue une exception donnée sous une forme lisible si self::logger vaut true.
137
	 * @param Exception	$e l'exception à logger
170
	 * @param Exception	$e l'exception à logger
138
	 */
171
	 */
139
	private static function loggerException($e) {
-
 
140
		if (self::$logger) {
-
 
141
			$erreur = '';
-
 
142
			$erreur .= $e->getMessage()."\n";
172
	private static function loggerException(Exception $e) {
143
			$erreur .= 'Fichier : '.$e->getFile()."\n";
-
 
144
			$erreur .= 'Ligne : '.$e->getLine()."\n";
-
 
145
			if (self::getContexte()) {
-
 
146
				$erreur .= 'Contexte : '."\n".print_r($e->getTraceAsString(), true)."\n";
-
 
147
			}
173
		if (self::$logger) {
148
			$erreur .= "\n";
174
			$message = self::formaterExceptionTxt($e);
149
			Log::ajouterEntree('erreurs', $erreur);
175
			Log::ajouterEntree('erreurs', $message);
-
 
176
		}
-
 
177
	}
-
 
178
	
-
 
179
	/**
-
 
180
	 * Formate en texte une exception passée en paramètre.
-
 
181
	 * @since 0.3
-
 
182
	 * @param Exception l'exception à formater.
-
 
183
	 */
-
 
184
	public static function formaterExceptionTxt(Exception $e) {
-
 
185
		$message = '';
-
 
186
		$message .= $e->getMessage()."\n";
-
 
187
		$message .= 'Fichier : '.$e->getFile()."\n";
-
 
188
		$message .= 'Ligne : '.$e->getLine()."\n";
-
 
189
		if (self::getContexte()) {
-
 
190
			$message .= 'Contexte : '."\n".print_r($e->getTraceAsString(), true)."\n";
-
 
191
		}
-
 
192
		$message .= "\n";
-
 
193
		return $message;
-
 
194
	}
-
 
195
	
-
 
196
	/**
-
 
197
	 * Formate en (X)HTML une exception passée en paramètre.
-
 
198
	 * @since 0.3
-
 
199
	 * @param Exception l'exception à formater.
-
 
200
	 */
-
 
201
	public static function formaterExceptionXhtml(Exception $e) {
-
 
202
		$message = '';
-
 
203
		$message .= '<div class="debogage">'."\n";
-
 
204
		$message .= $e->getMessage()."\n";
-
 
205
		$message .= '<span class="debogage_fichier">'.'Fichier : '.$e->getFile().'</span>'."\n";
-
 
206
		$message .= '<span class="debogage_ligne">'.'Ligne : '.$e->getLine().'</span>'."\n";
-
 
207
		if (self::getContexte()) {
-
 
208
			$message .= '<pre>'."\n";
-
 
209
			$message .= '<strong>Contexte : </strong>'."\n".print_r($e->getTraceAsString(), true)."\n";
-
 
210
			$message .= '</pre>'."\n";
-
 
211
		}
-
 
212
		$message .= '</div>'."\n";
150
		}
213
		return $message;
-
 
214
	}
-
 
215
	
-
 
216
	/**
-
 
217
	 * Lors de la destruction de la classe si des exceptions n'ont pas été affichées, et si le débogage est à true, elles sont
151
	}
218
	 * affichées. 
152
 
219
	 */
153
	public function __destruct() {
220
	public function __destruct() {
154
		// Si des erreurs n'ont pas été affichée nous forçons leur affichage
221
		// Si des erreurs n'ont pas été affichée nous forçons leur affichage
155
		if (self::$afficher && count(self::$exceptions) > 0) {
222
		if (self::$afficher && self::getExceptionsNbre() > 0) {
156
			echo self::getExceptions();
223
			echo self::getExceptionsFormatees();
Line 157... Line 224...
157
		}
224
		}
158
	}
225
	}
159
 
226