Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/01/2011, 10h26   #1
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 706
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 706
Points : 3 274
Points : 3 274
Par défaut 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.


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 ?
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 10h38   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
que fait ton Runfw_Exception::quick ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 11h04   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 706
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 706
Points : 3 274
Points : 3 274
Citation:
que fait ton Runfw_Exception::quick ?
J'ai pas mis le code c'est vrai, mais il renvoie le message d'erreur, disons que ça revient en gros à faire un echo $e->getMessage() à la place.


Mais en résumé le code est comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
 
public static function quick($message, $code, $file, $line, $trace = NULL) {
    self::setException($message, $code, $file, $line, $trace);
    self::setTypeErreur('erreur');
    self::setClassName('Exception');
    self::writeErreur();
    if (IS_DEBUG_EXCEPTION === TRUE) {
        self::afficherErreur();
    }
}
Le self::afficherErreur() renvoie le message (un echo).
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 11h15   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
fais comme ca plutot

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ob_start();
 
try
{
    include($vue_filename);
}
catch (Exception $e)
{
    ob_clean();
    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();
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 11h42   #5
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 706
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 706
Points : 3 274
Points : 3 274
Je viens d'essayer ... Excellent.

Franchement, merci, parce que là, je n'y aurais pas pensé.
Vraiment parfait
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h43.


 
 
 
 
Partenaires

Hébergement Web