Gestion des exceptions - Java - Programmation
Marsh Posté le 28-12-2004 à 22:23:03
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 :
|
Marsh Posté le 28-12-2004 à 22:52:38
ReplyMarsh Posté le 28-12-2004 à 23:14:08
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"...
Marsh Posté le 28-12-2004 à 23:21:07
ReplyMarsh Posté le 28-12-2004 à 23:52:09
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.
Marsh Posté le 29-12-2004 à 08:32:16
y a pas de procédure en java. c'est totu des fonctions. et tu peux utiliser return seul.
Marsh Posté le 29-12-2004 à 09:21:07
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.
Marsh Posté le 29-12-2004 à 09:36:00
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
Marsh Posté le 29-12-2004 à 11:22:54
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. |
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 :
|
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 ...
Marsh Posté le 29-12-2004 à 11:26:07
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 !=
Marsh Posté le 29-12-2004 à 11:42:57
Tu ne gère manifestement pas les exceptions correctement.
Code :
|
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 :
|
2. Soit tu la relances, éventuellement après avoir loggé:
Code :
|
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 :
|
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.
Marsh Posté le 29-12-2004 à 11:51:37
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
Marsh Posté le 29-12-2004 à 11:54:47
ben "tu la relances, éventuellement après avoir loggé", je vois pas ce qu'il y aurait de plus à dire?
Marsh Posté le 29-12-2004 à 11:55:19
sircam>>pour le cas 4, prière de mettre un exemple ou l'on catche une exception spécifique
Marsh Posté le 29-12-2004 à 12:00:46
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
Tu relances l'exception ? Tu relances l'appli ?
le "la" me laisse dubitatif
Marsh Posté le 29-12-2004 à 12:02:51
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...
Marsh Posté le 29-12-2004 à 13:33:35
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.
Marsh Posté le 29-12-2004 à 13:55:27
C'était po mon problème, me suis incrusté dans la conversation
Mais je vais relire qd mm, le cas 2 me parle toujours pas
Marsh Posté le 29-12-2004 à 14:05:14
Zedar a écrit : C'était po mon problème, me suis incrusté dans la conversation |
Ooops... M'en fout, ça vaut pour toi aussi
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.
Marsh Posté le 29-12-2004 à 14:10:20
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
Marsh Posté le 29-12-2004 à 14:31:01
la différence c'est qu'un autre bout de code, qui sait comment traiter le probleme, peut le faire.
Marsh Posté le 29-12-2004 à 14:40:02
Bon, je ne vais frapper. Du moins, pas encore.
"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).
Marsh Posté le 29-12-2004 à 14:44:30
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
PS : le forum agonise là ?
Marsh Posté le 29-12-2004 à 14:49:11
Ok merci Sircam, ça confirme ce que je pensais
C'était pas la peine de frapper finalement, la méthode douce a encore de beaux jours devant elle
Marsh Posté le 29-12-2004 à 14:54:37
tout ça pour dire que si c'est pour catcher une exception et ne rien faire, autant pas la catcher du tout.
Marsh Posté le 29-12-2004 à 15:00:16
Zedar a écrit : Aaaah ben oui... |
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).
Marsh Posté le 29-12-2004 à 15:06:32
Euh vi j'avais oublié la possibilité du throws.
merci pour toutes ces explications
(C'était bien une réflexion de fonctionnaire ça, R3g )
Marsh Posté le 29-12-2004 à 15:15:29
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.
Marsh Posté le 29-12-2004 à 15:30:51
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.
Marsh Posté le 29-12-2004 à 15:54:55
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.
Marsh Posté le 29-12-2004 à 16:20:57
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.
Marsh Posté le 29-12-2004 à 17:13:08
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 ?
Marsh Posté le 29-12-2004 à 17:13:42
ReplyMarsh Posté le 29-12-2004 à 17:19:21
bah de ce que ton exception represente pardi
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.
Marsh Posté le 29-12-2004 à 17:31:04
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.
Marsh Posté le 29-12-2004 à 17:32:03
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
Marsh Posté le 29-12-2004 à 17:32:36
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
Marsh Posté le 29-12-2004 à 17:37:12
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
Marsh Posté le 28-12-2004 à 21:57:53
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 :
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.