MVC + Exception
Résolu/Fermé
mikis69
Messages postés
168
Date d'inscription
mardi 26 novembre 2013
Statut
Membre
Dernière intervention
11 février 2019
-
2 mars 2014 à 13:59
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019 - 2 mars 2014 à 23:44
mikis69 Messages postés 168 Date d'inscription mardi 26 novembre 2013 Statut Membre Dernière intervention 11 février 2019 - 2 mars 2014 à 23:44
A voir également:
- MVC + Exception
- Une exception non gérée s'est produite dans votre application - Forum Word
- Erreur d'application : une exception côté client s'est produite (consultez la console du navigateur pour plus d'informations). - Forum Google Chrome
- Appliquez à tous les paragraphes du document à télécharger, à l’exception des titres et des sous-titres, la mise en forme suivante : - Guide
- L'exception exception logicielle inconnue 0xe0000008 ✓ - Forum PC fixe
- An exception occurred in the driver: could not find driver - Forum PHP
1 réponse
KX
Messages postés
16755
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
2 mars 2014 à 14:32
2 mars 2014 à 14:32
public Client(String nom, String prenom, String motPasse, String email, Adresse facturation) throws Exception {
if(email.trim().equals(""))throw new Exception("\nemail vide\n");
if(motPasse.trim().equals(""))throw new Exception("\nmot de passe vide\n"); // TRIM() correspond à quoi ?
this.nom = nom;
this.prenom = prenom;
this.motPasse = motPasse;
this.email = email;
this.facturation = facturation;
}
"TRIM() correspond à quoi ?"
C'est ton code, c'est donc à toi de le savoir, ou alors ne l'utilises pas...
En terme d'exception faire un throws Exception c'est un peu vague, il est conseillé d'utiliser des types d'exceptions aussi précis que possible.
De plus il faut savoir que les RuntimeException (et leurs classes filles) n'ont pas besoin d'être try/catché ce qui en fait une bonne exception pour éviter d'avoir des throws partout où en n'a pas réellement besoin.
Attention aussi à la gestion des paramètres qui peuvent potentiellement être null, et qui vont générer des NullPointerException si tu n'y prêtes pas attention. Il vaut donc mieux interdire le passage de null avec un IllegalArgumentException plutôt que de continuer ton code avec une valeur null qui va planter à la première méthode qui l'appellera...
Enfin, pas de \n dans un message d'exception, ça n'a pas de sens.
Remarques :
equals("")peut se simplifier avec
isEmpty().
Si tu as fait un trim sur email, autant le propager sur this.email
public Client(String nom, String prenom, String motPasse, String email, Adresse facturation) { if (nom==null) throw new IllegalArgumentException("nom ne doit pas être null"); if (prenom==null) throw new IllegalArgumentException("prenom ne doit pas être null"); if (motPasse==null) throw new IllegalArgumentException("motPasse ne doit pas être null"); if (email==null) throw new IllegalArgumentException("email ne doit pas être null"); if (facturation==null) throw new IllegalArgumentException("facturation ne doit pas être null"); this.nom = nom; this.prenom = prenom; this.motPasse = motPasse.trim(); if (this.motPasse.isEmpty()) throw new IllegalArgumentException("motPasse ne doit pas être vide"); this.email = email.trim(); if (this.email.isEmpty()) throw new IllegalArgumentException("email ne doit pas être vide"); this.facturation = facturation; // this.carte = ??? }
Bref, pour les exceptions, c'est à revoir.
Pour le modèle MVC j'ai l'impression que tu confonds qui fait quoi.
Ta classe Client c'est le modèle, ta classe LibrairieModele c'est le contrôleur, et ta classe LibrairieController c'est la vue... Donc à revoir aussi !
2 mars 2014 à 15:03
D'abord merci pour ta réponse, je regarde à ce que tu as dit.. Je tiens compte dans mes codes mais j'ai quelques questions donc..
Les exceptions ont des noms et c'est mieux de dire throw new (le nom de l'exception) plutôt que throw new Exception("..."); tout court
Genre throw new NumberFormatException("Il faut entrer un int et non un String"); ?
Après, tu m'as aussi dit que : "Si tu as fait un trim sur email, autant le propager sur this.email " ca revient à faire quoi ? A quoi sert ce passage du code ?
if (nom==null) throw new IllegalArgumentException("nom ne doit pas être null"); Comment un nom peut etre null, si ce n'est pas un objet mais juste une variable de type String ?
Aussi, tu me dis que je confond.. Que client = le modèle, le modèle le controleur, le controleur la vue..
Qu'est ce que tu met toi par exemple dans la modèle ? Parce que moi l'on m'a dit que le modèle est ce qui gère les données.. La vue affiche mais ne peut pas controler..
Merci de tes réponses et bonne journée !
2 mars 2014 à 15:30
Ce n'est pas une question de nom, mais une question de sens donné à l'excpetion.
Toutes les exceptions générées à cause d'un mauvais argument au passage d'une méthode devraient être IllegalArgumentException, comme c'est le cas ici pour ton constructeur.
Si tu mets juste Exception, c'est trop vague, car c'est la classe mère de toutes les exceptions, on sait qu'il y a un problème mais on ne sait pas lequel.
Pour ton exemple throw new NumberFormatException("Il faut entrer un int et non un String");
En en réalité si la cause du problème c'est que l'on a entré un String au lieu d'un entier, c'est plutôt un IllegalArgumentException, le NumberFormatException est plutôt lié à une erreur de type on voulait bien avoir un String comme paramètre, mais il devait représenté un entier et on a pas réussi à le convertir.
En réalité il est tout à fait possible d'avoir les deux cas de figures avec une méthode qui renvoie les deux types d'exceptions selon le déroulement de la méthode. Cela permet ensuite d'avoir un try/catch assez fin, en faisant le filtrage soit sur IllegalArgumentException, soit sur NumberFormatException , soit les deux, pour distinguer les différents cas d'erreurs possibles.
Mais si tu renvois toujours Exception, on ne peut pas faire la distinction, c'est donc inutilisable.
"Si tu as fait un trim sur email, autant le propager sur this.email " ca revient à faire quoi ? A quoi sert ce passage du code ?
trim permet d'enlever les espaces au début et à la fin de la chaîne de caractères, par exemple donne . Ce que tu fais c'est donc enlever les espaces inutiles pour regarder si le résultat est vide (c'est à dire qu'il n'y avait que des espaces). Moi ce que je dis c'est que si tu as déjà enlevé les espaces pour regarder si c'était vide, autant conserver la chaîne de caractères sans les espaces ( ) alors qu'avec ton code tu aurais conservé ...
if (nom==null) throw new IllegalArgumentException("nom ne doit pas être null"); Comment un nom peut etre null, si ce n'est pas un objet mais juste une variable de type String ?
Il suffit de faire ça :
Pour l'instant tu manipules principalement des données lues au clavier, mais ça c'est dans ta vue. Au niveau de ton modèle tu n'en sais rien. Si tu réutilises ton modèle pour pouvoir être utilisé depuis une base de données par exemple, tu peux rapidement te retrouver avec des NULL.
Il vaut donc mieux les détecter comme interdit, plutôt que de les autoriser, et que ça fasse planter le premier appel de méthode sur l'attribut. Par exemple motPasse.trim() avec motPasse==null ça va provoquer un NullPointerException. Or un IllegalArgumentException maîtrisé a plus de sens qu'un NullPointerException généré automatiquement.
tu me dis que je confond.. Que client = le modèle, le modèle le controleur, le controleur la vue.
Le modèle gère les données. Ici les données c'est tes classes Client, Adresse, CarteBancaire...
Le contrôleur manipule les données. Ce sont donc les méthodes d'ajout de client, de recherche...
La vue c'est l'interface utilisateur, c'est à dire les méthodes affiche, menu, etc.
Ce n'est pas du tout ce que tu as fait...
2 mars 2014 à 16:54
Je voulais savoir en plus, est ce qu'il existe un moyen pour afficher les différents messages d'exceptions ?
Du genre :
if (nom==null) throw new IllegalArgumentException("nom ne doit pas être null");
if (prenom==null) throw new IllegalArgumentException("prenom ne doit pas être null");
if (motPasse==null) throw new IllegalArgumentException("motPasse ne doit pas être null");
if (email==null) throw new IllegalArgumentException("email ne doit pas être null");
if (facturation==null) throw new IllegalArgumentException("facturation ne doit pas être null");
Si le nom est null, ceci apparait nom ne doit pas être null
Si c'est le prenom, ceci apparait prenom ne doit pas etre null
Mais si c'est le nom, prenom, motPasse qui sont null, seulement ce message apparait : nom ne doit pas etre null
Comment faire pour que les trois messages s'affichent ? nom ne doit pas etre null, prenom ne doit pas etre null, motPasse ne doit pas etre null
Faut il créer des exceptions personnalisées ? Du style : nomException, prenomException ?
2 mars 2014 à 17:28
Par exemple :
Cependant cette gestion d'exception je la mettrais plutôt côté vue, au moment de remplir un formulaire par exemple. Mais côté modèle je considère comme acquis que les vérifications d'usages ont déjà été faites côté vue, et que le passage de mauvais paramètres dans le modèle relève de l'erreur de codage.
2 mars 2014 à 17:43
Mais pour ton explication c'est moins.. claire je vais dire
Toi tu mettrais quoi côté vue ? ce que l'on met dans la classe client ? Ainsi d'abord on vérifie à l'aide de la vue ? (Mais la vue ne permet pas de faire des controles et donc pas de conditions dans une vue n'est ce pas ?)
Je ne comprend pas encore trop bien le concept de MVC apparemment :(