Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1366 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Gestion des exceptions

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Précédente
Auteur Sujet :

Gestion des exceptions

n°933275
joquetino
Posté le 28-12-2004 à 21:57:53  profilanswer
 

Bonjour,  
 
J'ai un ch'tit problème avec les exceptions. Je m'explique :
J'ai un formulaire qui demande à l'utilisateur de rentrer entre autre une date.
Je voudrais déclencher une exceptions lorsque la date entrée n'est pas correcte. Par exemple, date="exemple1";
 
J'ai écris le code suivant :  

Code :
  1. if (testdatedebut!="" )
  2.     {
  3.      try
  4.    {
  5.       SimpleDateFormat dateStandard = new SimpleDateFormat("dd/MM/yyyy" );
  6.       dateDebutProjet=dateStandard.parse(testdatedebut);
  7.    }
  8.      catch(Exception ex){System.out.println("erreur de date" );}
  9.     }


 
Ainsi, j'aimerai afficher un message d'erreur en console.  
Par la suite, je créerai une classe exceptionDateErreur() qui gérera les erreurs de date en affichant un tel message d'erreur.
Jusque là pas de problèmes, les excpetions sont biens captées par mon bloc try.
 
Mais moi, ce que j'aimerai, c'est que la corps de la fonction s'arrête là. C'est-à-dire, dès que l'excpetion est déclenché, rien n'est éxécuté par la suite.
 
Y a t-il un mot clé à ajouter pour faire cela?
 
 
Merci d'avance.

mood
Publicité
Posté le 28-12-2004 à 21:57:53  profilanswer
 

n°933295
sircam
I Like Trains
Posté le 28-12-2004 à 22:23:03  profilanswer
 

C'est à toi à agencer correctement ton code pour que "plus rien" ne s'exécute après l'exception, ctout.
 
Dès que le programme rencontre une exception, il cherche le bloc catch correspondant et l'exécute, puis de même avec le bloc finally. En l'absence de bloc catch, l'exception remonte le stack et c'est le même petit jeu au niveau de l'appelant.
 
Pour lancer une exception, tu fais un throw.
 

Code :
  1. MyException me = new MyException("Shit happened" );
  2. throw me;


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°933307
benou
Posté le 28-12-2004 à 22:52:38  profilanswer
 

un bon petit System.exit ?


---------------
ma vie, mon oeuvre - HomePlayer
n°933325
joquetino
Posté le 28-12-2004 à 23:14:08  profilanswer
 

benou a écrit :

un bon petit System.exit ?


Ca va pas aller, car System.exit(0) va quitter l'application.
Or moi, je souhaiterai seulement "sortir de la procédure"...

n°933330
benou
Posté le 28-12-2004 à 23:21:07  profilanswer
 

ben return alors ...


---------------
ma vie, mon oeuvre - HomePlayer
n°933354
joquetino
Posté le 28-12-2004 à 23:52:09  profilanswer
 

benou a écrit :

ben return alors ...


Return  ok dans le cas d'une fonction, mais ici c'est une procédure. :)  
Je crois que je vais devoir utiliser une variable(t), qui sera mis à vrai lorsqu'elle passe dans le catch.
Ensuite il suffira de tester cette variable :  
si t=true -->on éxécute pas la boucle
sinon on l'éxécute
 
C'est pas très propre mais ça rêgle le pb.

n°933403
benou
Posté le 29-12-2004 à 08:32:16  profilanswer
 

y a pas de procédure en java. c'est totu des fonctions. et tu peux utiliser return seul.


---------------
ma vie, mon oeuvre - HomePlayer
n°933411
sircam
I Like Trains
Posté le 29-12-2004 à 09:21:07  profilanswer
 

J'ai l'impression que tu t'embarques dans une mauvaise direction. Il est très rare que ce genre de contorsion trouve sa place dans un code correctement conçu.
 
Tu peux toujours filer ta solution si tu veux un avis critique et constructif.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°933418
Bidem
Posté le 29-12-2004 à 09:36:00  profilanswer
 

Le mieux à faire c'est de faire un throw dans ton block catch afin que l'appelant soit au courrant que le traitement ne s'est pas bien passé.
 
PS : En langage objet on n'a ni fonctions ni procédure mais des méthodes ;)


Message édité par Bidem le 29-12-2004 à 10:15:51
n°933471
joquetino
Posté le 29-12-2004 à 11:22:54  profilanswer
 

sircam a écrit :

J'ai l'impression que tu t'embarques dans une mauvaise direction. Il est très rare que ce genre de contorsion trouve sa place dans un code correctement conçu.
 
Tu peux toujours filer ta solution si tu veux un avis critique et constructif.


Alors je vais vous expliquer mon problème, ça va être aussi simple. Le but est de choper des valeurs d'un formulaire de différents type.
Voici le code associé

Code :
  1. //on récupère les champs du formulaire
  2.     String libelle=textnom.getText();
  3.     String com=textcom.getText();
  4.     String date1=date1.getText();
  5.     String date2=date2.getText();
  6.     String duree=textDuree.getText();
  7.     int dureeJours = Integer.parseInt(duree);
  8.     //on recupere et on initialise les dates
  9.     if (date1!="" )
  10.     {
  11.                       try{
  12.                
  13.       SimpleDateFormat dateStandard = new SimpleDateFormat("dd/MM/yyyy" );
  14.       dateDebut=dateStandard.parse(date2);
  15.                       }
  16.                       catch(Exception ex){}
  17.     }
  18.     else
  19.     {
  20.      dateDebut=new Date();//on cree une date null
  21.     }
  22.     if (date2!="" )
  23.     {
  24.      try
  25.    {
  26.       SimpleDateFormat dateStandard = new SimpleDateFormat("dd/MM/yyyy" );
  27.       dateFin=dateStandard.parse(date2);
  28.    }
  29.      catch(Exception ex){}
  30.     }
  31.     else
  32.     {
  33.      dateFin=new Date();
  34.     }
  35.     //on crée et on initialise une nouvel objet
  36.     Tache t=new Tache(libelle,com,dateDebut,dateFin,dureeJours);
  37. this.dispose();


 
 
Donc moi ce que je souhaiterai, c'est déclencher des exceptions quand :
  - le format de la date est erroné, en sachant que la date peut etre vide
  - le format de la durée est erroné
 
Voilà le pb ...
 

mood
Publicité
Posté le 29-12-2004 à 11:22:54  profilanswer
 

n°933474
benou
Posté le 29-12-2004 à 11:26:07  profilanswer
 

ben les exceptions sont levées pour toi, mais là tu les catches sans rien faire ... fait le traitement approprié dans les catch.
 
et les chaines de caractère, ca se compare en faisant .equals(), pas == ou !=


---------------
ma vie, mon oeuvre - HomePlayer
n°933484
sircam
I Like Trains
Posté le 29-12-2004 à 11:42:57  profilanswer
 

Tu ne gère manifestement pas les exceptions correctement.
 

Code :
  1. catch(Exception ex){}


C'est ce que j'appelle "catch-and-burry" : tu attrapes l'exception et tu l'enterres. Ce n'est jamais une bonne idée.
 
1. Soit tu traites l'exception sur place:

Code :
  1. catch (Exception e) {
  2.    // doSomethingToRecover
  3.    (...)
  4. }


 
2. Soit tu la relances, éventuellement après avoir loggé:

Code :
  1. catch (Exception e) {
  2.    Log.error("Shit happened" );
  3.    throw e;
  4. }


 
3. Soit tu ne l'attrapes pas. Le bloc finally éventuel est exécuté et l'exception remonte le stack, à charge pour l'appelant de la traiter ou de la déférer.
 
4. Cas rare : l'exception est "normale", il n'y a rien à faire. Dans ce cas, il est bon de mettre un commentaire indiquant cette condition :

Code :
  1. catch (Exception e) {
  2.    // Do nothing; normal condition.
  3. }


 

Citation :

et les chaines de caractère, ca se compare en faisant .equals(), pas == ou !=


!!!
Le pire, c'est que ça marche sans doute dans ton cas, mais c'est jouer sur un effet de bord dangereux.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°933496
zedar
Posté le 29-12-2004 à 11:51:37  profilanswer
 

Tiens Sircam, tu pourrais expliquer un peu ton cas 2 stp ?
Ce que ça fait exactement et l'intérêt de le faire (le throw dans le catch) ?
 
Merci :jap:

n°933499
the real m​oins moins
Posté le 29-12-2004 à 11:54:47  profilanswer
 

ben "tu la relances, éventuellement après avoir loggé", je vois pas ce qu'il y aurait de plus à dire?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°933500
the real m​oins moins
Posté le 29-12-2004 à 11:55:19  profilanswer
 

sircam>>pour le cas 4, prière de mettre un exemple ou l'on catche une exception spécifique ;)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°933503
zedar
Posté le 29-12-2004 à 12:00:46  profilanswer
 

the real moins moins a écrit :

ben "tu la relances, éventuellement après avoir loggé", je vois pas ce qu'il y aurait de plus à dire?


 
Scuse je débute en Java  :whistle:  
 
Tu relances l'exception ? Tu relances l'appli ?
 
le "la" me laisse dubitatif

n°933504
the real m​oins moins
Posté le 29-12-2004 à 12:02:51  profilanswer
 

ha, oui, tu relances l'exception. elle continue à remonter la pile de la meme façon que si tu ne l'avais pas catchée quoi...


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°933542
sircam
I Like Trains
Posté le 29-12-2004 à 13:33:35  profilanswer
 

Cas 2° : non, y'a rien de plus à dire, ça dit ce que ça fait et ça fait ce que ça dit.
 
Cas 4° : de fait, c'est plutôt une exception bien particulière plutôt que Exception qu'on va attraper. NumberFormatException, InterruptedException p.e.
 
joquetino, je crois que tu vas un peu trop vite. Je te conseille de laisser ton problème concret de côté et de faire des tests de bases avec les différents cas exposés.
 
Revois le chapitre consacré aux exceptions avant de continuer. A défaut, tu vas prendre de très mauvaises habitudes et ça va pas être joli à voir.


Message édité par sircam le 29-12-2004 à 13:59:51

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°933552
zedar
Posté le 29-12-2004 à 13:55:27  profilanswer
 

C'était po mon problème, me suis incrusté dans la conversation [:petrus75]
 
Mais je vais relire qd mm, le cas 2 me parle toujours pas :'(

n°933554
sircam
I Like Trains
Posté le 29-12-2004 à 14:05:14  profilanswer
 

Zedar a écrit :

C'était po mon problème, me suis incrusté dans la conversation [:petrus75]


Ooops... M'en fout, ça vaut pour toi aussi [:itm]
 

Zedar a écrit :

Mais je vais relire qd mm, le cas 2 me parle toujours pas :'(


M'enfin, c'est pourtant simple.
 
Plutôt que de simplement laisser remonter l'exception (car tu ne sais rien en faire), tu veux d'abord la logger. Légitime, non ? Tu fais cela dans un bloc catch. Mais comme tu ne sais toujours pas quoi en faire - tu n'as fait le catch que pour la logger, pas pour la résoudre -, tu la rebalances, hop la patate chaude, j'ai pris note de ce qui c'est passé dans mon catch mais je sais rien en faire, throw e.
[:crosscrusher]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°933557
zedar
Posté le 29-12-2004 à 14:10:20  profilanswer
 

Mais pourquoi la relancer, si on ne sait rien en faire, on la log et basta (i.e. le même code sans le throw). Quelle est la différence alors ?
 
Tapez pas trop fort
 
EDIT : merci pour les explications, je sens que j'aurai pas perdu ma journée si je comprends ça ;)


Message édité par zedar le 29-12-2004 à 14:10:52
n°933572
lorill
Posté le 29-12-2004 à 14:31:01  profilanswer
 

la différence c'est qu'un autre bout de code, qui sait comment traiter le probleme, peut le faire.

n°933576
sircam
I Like Trains
Posté le 29-12-2004 à 14:40:02  profilanswer
 

Bon, je ne vais frapper. Du moins, pas encore. [:djswad]
 
"On la log et basta". Et quoi, tu continues l'exécution de ton programme comme si de rien n'était ? Alors que tout le reste du bloc try après l'instruction qui soulève l'exception n'est même pas exécuté ? Ton programme se comportera de manière tout à fait inconsistante, puisqu'une partie du flux normal n'aura pas été exécutée, mais qu'il n'y aura aucune erreur signalée ni aucune correction apportée.
 
DONC, tu la logges, et tu la relances. Si l'appelant ne sait rien en faire, il fait de même. En bout de chaîne, un composant devra bien en faire qq chose, ne serait-ce que "Erreur technique, blablabla" à l'écran. A défaut, la JVM termine (ça ne doit arriver que lors du debugging, hein, sinon, heu, c'est pas super user-friendly. Ou alors, c'est un application type interne pour des power user).


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°933579
zedar
Posté le 29-12-2004 à 14:44:30  profilanswer
 

Aaaah ben oui...  
Donc les appels à la méthode qui contenait ce try/catch devront être eux-même dans un try/catch pour éventuellement récupérer cette exception, alors qu'en ne mettant pas le throw, ce n'est pas la peine (mais on perd alors l'exception).
 
Dis moi si je me plante, mais en tout cas merci :jap:
 
PS : le forum agonise là ?

n°933581
zedar
Posté le 29-12-2004 à 14:49:11  profilanswer
 

Ok merci Sircam, ça confirme ce que je pensais :jap:
 
C'était pas la peine de frapper finalement, la méthode douce a encore de beaux jours devant elle :p

n°933583
R3g
fonctionnaire certifié ITIL
Posté le 29-12-2004 à 14:54:37  profilanswer
 

tout ça pour dire que si c'est pour catcher une exception et ne rien faire, autant pas la catcher du tout.

n°933585
sircam
I Like Trains
Posté le 29-12-2004 à 15:00:16  profilanswer
 

:pfff:

Zedar a écrit :

Aaaah ben oui...  
Donc les appels à la méthode qui contenait ce try/catch devront être eux-même dans un try/catch pour éventuellement récupérer cette exception, alors qu'en ne mettant pas le throw, ce n'est pas la peine (mais on perd alors l'exception).


 :non:  
Non, l'appelant ne doit pas forcément encadrer l'appel dans un bloc try/catch. Il peut se contenter de déclarer qu'il peut lui-même, par l'intermédiaire de l'appelé en l'occurence, générer une exception à l'aide de la clause throws.
 
Si l'exception est unchecked, ce n'est même pas nécessaire (et c'est le cas implicitement dans tout programme : tu fais rarement un catch de OutOfMemoryException, or cette condition peut se produire n'importe où, en dehors de tout bloc try/catch ou de clause throws).
 
Et en ne mettant pas le throw, on ne perd pas l'exception si on n'est pas dans le bloc catch, ou s'il n'y a pas de bloc catch, nous sommes bien d'accord (cas n°3 supra).


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°933588
zedar
Posté le 29-12-2004 à 15:06:32  profilanswer
 

Euh vi j'avais oublié la possibilité du throws.
 
merci pour toutes ces explications :jap:
 
(C'était bien une réflexion de fonctionnaire ça, R3g :o)

n°933596
R3g
fonctionnaire certifié ITIL
Posté le 29-12-2004 à 15:15:29  profilanswer
 

sircam > mauvais exemple ; OutOfMemory est une Error, qui par définition n'est pas sensée être catchée, sauf à de très rares exceptions.

n°933603
sircam
I Like Trains
Posté le 29-12-2004 à 15:30:51  profilanswer
 

Si, bon exemple, justement : elle est unchecked, donc la clause throws n'est pas nécessaire et, comme je le dis, tu en fais rarement un catch.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°933615
R3g
fonctionnaire certifié ITIL
Posté le 29-12-2004 à 15:54:55  profilanswer
 

sircam a écrit :

Si, bon exemple, justement : elle est unchecked, donc la clause throws n'est pas nécessaire et, comme je le dis, tu en fais rarement un catch.


Ce que je voulais dire c'est que c'est une Error, pas une Exception. Les Error et les RuntimeException ne représentent pas du tout le même gere de choses.

n°933634
sircam
I Like Trains
Posté le 29-12-2004 à 16:20:57  profilanswer
 

En fait, on devrait plutôt parler de Throwable pour être tout à fait général en théorie, mais comme effectivement la sous-classe Error est généralement tout à fait ignorée, on ne s'interesse en pratique qu'à Exception.
 
Tu as raison et pour le surplus, ça nous évite d'embrouiller les esprits. Il faut préciser que les exceptions unchecked sont du sous-type RuntimeException :-S
 
Mais il ne serait pas incorrect de dire que IllegalArgumentException est une exception unchecked.
 
:jap:


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°933670
Jubijub
Parce que je le VD bien
Posté le 29-12-2004 à 17:13:08  profilanswer
 

ah oui tiens...vous faites vos exceptions perso comment : vous les faites hériter d'exception, vous implémentez Throwable ? vous sous classez une exception existante ?

n°933672
the real m​oins moins
Posté le 29-12-2004 à 17:13:42  profilanswer
 

ben ça dépend


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°933678
Jubijub
Parce que je le VD bien
Posté le 29-12-2004 à 17:16:04  profilanswer
 

de quoi justement [:petrus75]

n°933680
the real m​oins moins
Posté le 29-12-2004 à 17:19:21  profilanswer
 

bah de ce que ton exception represente pardi [:mlc]
 
le seul truc qui ne varie pas, pour moi (enfin, j'essaie de m'y tenir), c'est les constructeurs: je n'expose que ceux dont j'ai réellement besoin, jamais plus les 4 constructeurs d'Exception.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°933690
sircam
I Like Trains
Posté le 29-12-2004 à 17:31:04  profilanswer
 

Tu peux imaginer une sous-classe d'Exception qui sera la classe mère de toutes les exceptions de ton application. Ce qui me paraît de bonne pratique.
 
Typiquement, ton exception a au moins un message d'erreur (pour faciliter le logging). Tu peux mettre en place un système de codes.
 
Et selon les besoins, toutes les infos utiles et pertinentes  en fonction du contexte.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°933693
the real m​oins moins
Posté le 29-12-2004 à 17:32:03  profilanswer
 

sircam a écrit :

Tu peux mettre en place un système de codes.


où il serait d'ailleurs de fort bon aloy d'utiliser une enum :)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°933694
lorill
Posté le 29-12-2004 à 17:32:36  profilanswer
 

bof, perso je préfere ne pas avoir d'exception applicatives, et hériter de celles qui sont correctes si possibles.
 
par exemple, si j'ai une erreur de connexion, ca me semble logique de surclasser IOException

n°933699
sircam
I Like Trains
Posté le 29-12-2004 à 17:37:12  profilanswer
 

the real moins moins a écrit :

où il serait d'ailleurs de fort bon aloy d'utiliser une enum :)


Merci, je bosse en 1.3, alors  :pfff:  


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Gestion des exceptions

 

Sujets relatifs
[ASPX][C#] Gérer des données sur une page, gestion des event[Java] Multithreading et gestion des exceptions
Gestion particulière d'exceptions à coup de finally...Gestion des Exceptions
Le mécanisme de gestion d'exceptions des JSP2 questions : gestion des exceptions et paramètres des fonctions
gestion des exceptions dans les classes en cppGestion des exceptions dans les Servlets
Gestion des exceptions dans des DLL[Delphi/COM+] Gestion des exceptions ...
Plus de sujets relatifs à : Gestion des exceptions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR