Gestion des erreurs et exceptions et MVC
Salut à tous ;)
Je rencontre un problème concernant la gestions des erreurs et des exceptions dans une structure MVC, et particulièrement au niveau des vues.
Pour résumer un peu la situation, et déjà voir si j'ai bien compris tout ça.
J'ai une classe "core", (donc général) qui contient entre autre ceci : (en simplifié)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public function initConfigErrors() {
set_exception_handler(array('Runfw', 'exceptionHandler'));
set_error_handler(array('Runfw', 'errorHandler'), E_ALL | E_STRICT);
}
public static function errorHandler($code, $error, $file = NULL, $line = NULL, $trace = NULL) {
if (error_reporting() & $code) {
throw new ErrorException($error, $code, 0, $file, $line);
}
return TRUE;
} |
Donc toutes les erreurs php sont considérées comme des exceptions.
Puis si j'ai bien compris ceci, la méthode Runfw::exceptionHandler() est en quelque sorte le dernier recourt pour toutes exceptions qui ne seraient pas attrapées (catchées), en amont.
Au niveau des chargements des vue (classe View), je procède comme ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
public static function capture($vue_filename, array $vue_data = NULL) {
if (!empty($vue_data)) extract($vue_data, EXTR_SKIP);
ob_start();
try {
include($vue_filename);
}
catch (Exception $e) {
Runfw_Exception::quick($e->getMessage(), $e->getCode(), $e->getFile(), $e->getLine(), $e->getTrace());
}
// Retourne la capture de sortie et vide le buffer
return ob_get_clean();
} |
Ce qui m'agace (un peu beaucoup), c'est que, si par exemple j'ai une variable non déclarée par exemple dans une vue, le code HTML généré n'est plus complet, le résultat visuel part en sucette, et ça arrive de ne pas percevoir l'erreur, à part regarder/éplucher dans le code générer.
Pas franchement pratique coté débug. :aie:
Je me dis qu'il serait pas mal de ne pas renvoyer (echo) de suite l'erreur, mais pourquoi pas les stocker au fur et à mesure que les vues se chargent, et à la fin afficher les éventuelles erreurs.
Mais avec ce ob_start()/ob_get_clean() je ne vois pas trop comment faire ça, puis j'en sais rien si c'est vraiment pratique.
Comment feriez vous ça dans un contexte comme celui ci ? ;)