Bonjour (bonsoir) à tous
Je cherche un moyen de mieux structurer une gestion des erreurs, particulièrement avec une classe étendue de PDO.
J'estime que mon code n'est pas zen du tout à ce niveau même si au bout j'ai un rendu correcte.
Le but est de pouvoir personnaliser le retour d'erreur "PDOException" en transmettant la requête SQL, le tout assez proprement.
Dans le cas présent je transmet la requête (message perso) à l'aide d'un 6ème paramètre ...
Question : Comment faire autrement ?
Le code est le suivant : (je simplifie pour éviter un surplus de code inutile)
La fonction de la gestion des erreurs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 // On défini la fonction personnelle de la gestion des erreurs set_error_handler('erreur2Exception');
// C'est ce 6ème paramètre qui me semble pas zen, c'est l'astuce que j'utilise pour le moment
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 function erreur2Exception($code, $message, $file, $line, $context = null, $msessage_perso = null) { $MyException = new MyException($code, $message, $file, $line, $context = null, $msessage_perso); $MyException->setNiveauErreur(); $MyException->writeErreur(); echo $MyException->afficherErreur(); }
La classe perso des exceptions
Exemple d'une méthode de la classe étendue PDO
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 class MyException extends Exception { public function __construct ($code, $message, $file, $line, $context = null, $message_perso = null) { $this->code = $code; $this->message = $message; $this->file = $file; $this->line = $line; // Toujours ce 6ème paramètre $this->message_perso = $message_perso; } public function afficherErreur() { $str .= '<br />['.date("d/m/Y H\hi:s").'][Code : '.$this->getCode().']['.$this->getNiveauErreur().'][compteur : '.self::$compteurErreur.']'.PHP_EOL; $str .= '<br />Fichier : '.$this->getFile().' à la ligne : '.$this->getLine().PHP_EOL; $str .= '<br />'.$this->getMessage().PHP_EOL; if (!empty($this->message_perso)) { $str .= '<br />'.$this->message_perso.PHP_EOL; } return $str; } }
Enfin, la classe permettant le debuggage, et transmettre la requête SQL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class PdoMySQL extends PDO { public function prepare($statement, $array = array()) { self::$query = $statement; try { return parent::prepare(self::$query); } catch (PDOException $e) { MysqlDebug::debugErreur($e); } } }
Tout ceci permet d'obtenir (en cas d'erreur) un message comme ceci :
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 class MysqlDebug { protected static $debug = array(); // Requêtes dans un tableau protected static $counter = 0; // Compteur pour le débuggage // public static function debugErreur($exception) { $trace = $exception->getTrace(); $pageErr = $trace[1]['file']; $ligneErr = $trace[1]['line']; $msg_perso = ''; $query = PdoMySQL::getQuery(); if (!empty($query)) { $msg_perso = 'Requête :<br />'.nl2br($query); erreur2Exception(E_ERROR, $exception->getMessage(), $pageErr, $ligneErr, null, $msg_perso); } } }
[06/02/2010 22h17:21][Code : 1][Erreur : E_ERROR][compteur : 1]
Fichier : communs/classes/PdoMySQL.php à la ligne : 362
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'projet.essais' doesn't exist
Requête :
UPDATE essais SET nom = :nom
WHERE id = :_id
J'espère ne pas avoir été trop long et trop flou.
Les 2 parties principales restent cependant la classe MyException et MysqlDebug.
Merci pour toute aide et avis éclairé.
Partager