begin process at 2012 05 31 10:34:30
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

POO

 > 

Autre

 > 

Throw new HOW ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Throw new HOW ?

mercredi 30 janvier 2008 à 13:46:53 | Throw new HOW ?

codefalse

Administrateur CodeS-SourceS
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 :)
mercredi 30 janvier 2008 à 17:17:59 | Re : Throw new HOW ?

coucou747

Administrateur CodeS-SourceS
Réponse acceptée !
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
*/
mercredi 30 janvier 2008 à 18:32:37 | Re : Throw new HOW ?

codefalse

Administrateur CodeS-SourceS
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 ?
mercredi 30 janvier 2008 à 19:07:18 | Re : Throw new HOW ?

coucou747

Administrateur CodeS-SourceS
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
*/
mercredi 30 janvier 2008 à 19:58:57 | Re : Throw new HOW ?

codefalse

Administrateur CodeS-SourceS
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 ?
mercredi 30 janvier 2008 à 20:05:08 | Re : Throw new HOW ?

coucou747

Administrateur CodeS-SourceS
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
*/
mercredi 30 janvier 2008 à 20:07:41 | Re : Throw new HOW ?

codefalse

Administrateur CodeS-SourceS
Apparement la méthode getTrace de Exception ne fonctionne pas bien, j'ai jamais de bonnes valeurs ! :/
mercredi 30 janvier 2008 à 20:34:11 | Re : Throw new HOW ?

malalam

Administrateur CodeS-SourceS
Réponse acceptée !
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.

mercredi 30 janvier 2008 à 20:41:09 | Re : Throw new HOW ?

codefalse

Administrateur CodeS-SourceS
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 ?
mercredi 30 janvier 2008 à 20:47:27 | Re : Throw new HOW ?

malalam

Administrateur CodeS-SourceS
Ma foi, why not :-)

1 2

Cette discussion est classée dans : classe, exception, throw, alternativexception, myexception


Répondre à ce message

Sujets en rapport avec ce message

probleme de classe en php [ par Elkaire ] Donc voila mon probleme!!dans une premiere page je rensegne les insances de mon objet. Une fois renseigné je peux réutiliser les instances cet objet d Parametre de ma classe connexion et connexion/deconnexion [ par sebos63 ] Bonjour, 1. J'ai une classe de connexion et je souhaiterais savoir où il est judicieux de spécifier les paramètres d'une connexion. (Dans mon construc template.inc [ par joedalton ] bonjourVoila, je possede un fichier template.inc qui me permet de définir ma classe template, mais le probleme c'est que ce fichier est valable pour l Inversion de matrice [ par VanSama ] Bonjours, pour les besoins d'analyse d'une image, je recherche un algorithme de d'inversion d'une matrice NxN.J'ai lue beaucoup de chose sur le site d Quand on parle de Classe [ par Tomcube ] C'est une question très vaste,On parle de plus en plus de programmation objet. Qui dit programmation objet dit classe. D'ailleurs, c'est fou le nombre problème de classe [ par guixyz ] Hello! Voila je suis en train d'apprendre a me servir des classes en php. Et j'en ai fait une pour gérer mes formulaires Donc j'ai ma classe, une fcti Pb avec classe en php, Affichage [ par matou82 ] Je voudrais savoir comment surcharger l'affichage d' echo ou print pour une classePour avoir:$obj = new Maclass;echo $obj;Cela affiche : "Object" Je s Classe et panier [ par romalafrite ] http://www.phpcs.com/code.aspx?ID=12931Quelqu'un peut me dire comment récupérer le contenu du panier une fois que la sélection a été faite ?visit inte fatal error sur chargement de class [ par fabrice_pi ] salut à tous,j'utilise une classe PHP pour faire mes taleaux en html. depuis peu j'ai l'erreur suivante :Fatal error: Cannot instantiate non-existent PROBLEME DE CLASSE [ par FGONET ] Bonjour,J'ai un petit problème avec une classeJ'utilise la classe suivante :class ToolBox{var $prvId;var $prvTitre;function FillTables(){$locResult[0]


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales