Throw new HOW ?

Résolu
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 - 30 janv. 2008 à 13:46
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 - 30 janv. 2008 à 21:14
Hello tout le monde ! :)

Alors voila, pour mes besoins perso je me suis fait une classe AlternativException extends Exception et une classe InvalidArgumentException extends AlternativException.

Mon problème, c'est au niveau du multilangage. Comment vous, dans votre configuration actuelle, vous faites pour que si vous lancez une exception genre
throw new MyException ("Nom du type qui connait la grand mère du voisin INVALIDE");
@note : MyException extends AlternativException

Bah si le site est en anglais, vous ayez un truc en anglais etc ?

J'était partit sur une idée de constantes, faire un truc genre
throw new MyException (MyException::INVALID_NEIGHBOOR_GRANDMA_NAME);

Le probleme, c'est que dans AlternativException, si je veux connaitre la classe à l'origine de l'exception, bizzarement getTrace me retourne rien de valide, je doit donc faire un throw new UneException(constante, classname, methodName, File, Line); pour avoir une tracabilité complete

Car ensuite je pensais faire un fichier xml avec
<root>
   <MyException lang="fr">
         <constanteValue1><!-- INVALID_NEIGHBOOR_GRANDMA_NAME -->Nom du type qui connait la grand mère du voisin INVALIDE</constanteValue1>
         <etc />
    </MyException>
    <MyException lang="en">

         <constanteValue1><!-- INVALID_NEIGHBOOR_GRANDMA_NAME
-->Invalid name of the guy who know the neighboor's grand ma</constanteValue1>

         <etc />

    </MyException>
</root>

et dans AlternativException, ouvrir le fichier xml, aller dans root>Class_qui_lance_exception, lang="analyse du navigateur">ConstanteValue pour récuperer la valeur et afficher un message internationalisé !

Mes questions sont donc :
_ Comment paliez-vous au probleme du getTrace qui retourne rien de normal ?
_Que pensez-vous de cette méthode ? En avez-vous une meilleur à proposer ? (je suis ouvert à toutes les propositions !)

Merci de vos réponses :)

12 réponses

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 janv. 2008 à 17:17
salut
pour moi une exception ca ne doit pas etre lu par un internaute classique... ca s'affiche pendant le debug, ca se log en production, donc je ne vois pas l'interret de mettre une traduction sur une exception
/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 janv. 2008 à 20:34
Hello,

une exception, quand on affiche son "trace", le fait dans la méthode qui fait le throw. D'où de possible décalage. Mais le "trace" permet de remonter. C'est pour ça que moi, j'utilise toujours __LINE__, __FUNCTION__ etc. Mais dans mon throw. Parfce que ton throw est lancé dans ExceptionManager, tjrs, dans ton cas. Donc c'est cohérent, ce que tu fais.
Maintenant, selon moi, une exception peut-être vue par l'utilisateur, je ne suis pas d'accord avec Coucou là-dessus. Mais c'est une question de philosophie. Quand on n'utilise pas des exceptions, mais qu'on tâche de gérer les erreurs, on affiche un message d'erreur à notre utilisateur si la connexion à la base de données à échouer quand il va sur une page, par exemple. Ben si on utilise les exceptions, pourquoi ne pas lui balancer le message de l'exception, après tout. Jez ne vois pas le problème là-dedans. On lui balance le getmessage(), ou une autre méthode destiné à l'utilisateur, et en même temps, au lancern l'exception se logge et fait les opérations qu'elle doit faire (envoyer un email à l'admin, etc...).
Pour les traductions, moi j'opte dans ce cas pour le xml. Bon, codefalse, tu connais mon backoffice d'internationalisation donc tu connais le principe : je fais en effet correspondre le code de mon exception (ou sa constante en chaîne) à un tag du fichier xml d'internationalisation.
3
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
30 janv. 2008 à 18:32
Dans ce cas est-il possible d'empecher une exception, genre si je fait un throw new myException, dans ma classe myException, est-il possible de vérifier si on est en prod ou pas, si oui, logger l'erreur, sinon lancer l'exception ?

Sinon comment faire ?
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 janv. 2008 à 19:07
t'as des choses dans $_SERVER qui peuvent te dire si t'es en local ou pas

a mon avis, l'exception doit-etre lancee en production ou pas, mais si t'es en production, il logue et ferme la page, sinon il affiche le message

/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
30 janv. 2008 à 19:58
nan ce que je veux dire c'est admettons ce code :

class MyException extends Exception {}

class uneClass {
    public function uneMethode () {
         if (func_ger_args() > 0)
             throw new MyException ("Vous devez spécifier au maximum -1 arguments !");
    }
}

$mC = new uneClass ();
$mC->uneMethode ();

Forcément, j'aurai une exception (sauf si j'ai fait une erreur dans mon code), mais comment faire pour éviter une exception si je décide de passer en production ?
Est-il possible dans la class myException d'empecher l'exception de se lancer ?

La solution que j'ai trouvé la plus plausible (apres, c'est ma vision, et j'espere qu'elle sera critiquée), c'est de ne pas faire comme indiqué avant, mais comme ceci :

class ExceptionManager { // Le extends Exceptions est à voir, je sais pas si c'est possible
// Sinon faire une classe à part
     public static fonction throw ($sExceptionClass, $sMessage, $iCode, $sClassName, $sMethodName, $sFileName, $iLineNumber) {
        if ($bProduction == true)
             Log::log ("Une erreur s'est produite le $date : $sMessage ($iCode), provenant de $sClassName::$sMethodName (); Fichier $sFileName, ligne $iLineNumber");
         else
             throw new $sExceptionClass ($sMessage, $iCode, $sClassName, $sMethodName, $sFileName, $iLineNumber);
     }

Bon c'est de l'abrégé (pas de tests si la classe existe avant de l'instancier, pas de vérifications etc, c'est juste pour l'exemple)
Et du coup, en reprenant le premier exemple :

class MyException extends Exception {}

class uneClass {

    public function uneMethode () {

         if (func_ger_args() > 0)

             ExceptionManager::throw ("MyException", "Vous devez spécifier au maximum -1 arguments !", 030332, __CLASS__, __FUNCTION__, __FILE__, __LINE__);

    }

}


$mC = new uneClass ();

$mC->uneMethode ();

Perso tu aurait fait comment toi ?
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
30 janv. 2008 à 20:05
j'y avais pense, ta solution me semble envisageable, cependant :

__CLASS__, __FUNCTION__, __FILE__, __LINE__

c'est inutile, les exceptions ont deja une trace d'appels avec ces infos

/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
30 janv. 2008 à 20:07
Apparement la méthode getTrace de Exception ne fonctionne pas bien, j'ai jamais de bonnes valeurs ! :/
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
30 janv. 2008 à 20:41
Ouep Malalam, ton i18n, je l'ai bien regardé, et je crois même qu'inconsciement je me base dessus ! :p

Pour ce qui est de l'exception, perso je dirai bien de mixer vos deux idées, à savoir si on est en prod, l'exception est caché par la class ManageException qui va pas réellement la lancer, mais en échange, elle va rediriger l'utilisateur sur une page personnalisée, qui pourra indiquer l'erreur (le message) à l'origine du probleme

Voici l'implémentation au cas ou je me serai mal exprimé :

class ExceptionManager { // Le extends Exceptions est à voir, je sais pas si c'est possible
// Sinon faire une classe à part
     public static fonction throw ($sExceptionClass, $sMessage, $iCode, $sClassName, $sMethodName, $sFileName, $iLineNumber) {
        if ($bProduction == true) {
            
Log::log ("Une erreur s'est produite le $date : $sMessage ($iCode),
provenant de $sClassName::$sMethodName (); Fichier $sFileName, ligne
$iLineNumber");
             Template::Show ('erreur.tpl', array("message"=>$sMessage, "code"=>$iCode, "classname"=>$sClassName, "filename"=>$sFileName, "linenumber"=>$iLineNumber);
       }
         else
             throw new $sExceptionClass ($sMessage, $iCode, $sClassName, $sMethodName, $sFileName, $iLineNumber);
}

et l'auteur du fichier erreur.tpl pourra choisir d'afficher le message, la class/méthode, le fichier, etc. Ce qu'il veut divulguer à l'utilisateur.

Ca augmente le niveau de possibilités.

Qu'en pensez-vous ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 janv. 2008 à 20:47
Ma foi, why not :-)
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
30 janv. 2008 à 21:06
tu n'a pas l'air d'accord Malalam :p
Toi tu serai plus sur le fait de ne faire que des exceptions, point barre ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 janv. 2008 à 21:11
si si : lol..."why not" = "pourquoi pas" hein. Je suis d'accord.
Et non, franchement, c'est une question de philosophie. Moi, enj général, j'ai une boîte de message quelquepart qui va afficher le message de mon exeption, oui. Et selon les cas je peux varier ke principe...si je dois rediriger, ou autre. Mais globalement ça me suffit.
Mais ta référence pour rediriger l'internaute sur une page autre ne me pose aucun soucis.C'est logique et propre.
0
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
30 janv. 2008 à 21:14
Parfait, jvais implémenter ca alors !!
Encore une fois, merci infinement pour vos aides à vous deux :)
0
Rejoignez-nous