|
|||||||
| Débats Les débats et sondages sur le langage et les technologies Java |
|
|
Publicité ' | |||||||||||||||||
|
|
|
Outils de la discussion |
|
|
#141 |
|
Invité régulier
![]() Inscription : juillet 2008 Messages : 8 ![]() |
Pourquoi vouloir à tout prix énumérer chaque type d'exception trapée pour au final faire le même traitement ?
Qu'est-ce qui vous déplait tant dans le fait de ne garder qu'un seul et unique bloc qui trape le type Exception ou éventuellement un type commun plus précis ? Qu'est-ce qui vous manque dans cette solution si simple ? Ok, on risque de prendre plus de monde avec une classe mère commune, mais est-ce si grave que cela ? Plusieurs d'entre vous l'ont dit : peu importe le type trapé, le traitement au final reste le même et l'exception sera ensuite remontée à l'appelant. Vraiment, je ne vois pas ce que ces syntaxes apportent de vital qui n'existerait pas déja dans le langage, à par une complexité cachée additionnelle et les risques d'incompréhension habituel de ce genre de gadget. |
|
|
00
|
|
|
#142 | |
|
Membre habitué
![]() Inscription : juin 2004 Messages : 175 ![]() |
Citation:
En plus j'ai du mal à voir comment tu vas les nommer ces méthodes? methodeName_exception ? et si tu gère plusieurs fois la même exception dans ta méthode tu fais methodeName_exception1 methodeName_exception2 methodeName_exception3 ... ? pas sur que ce soit très lisible tout ça.
__________________
En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche. (Jacques Rouxel : "Les shadoks") |
|
|
|
00
|
|
|
#143 |
|
Expert Confirmé Sénior
![]() ![]() |
Oui c'est grave, quand ton type commun est "Exception", tu va chopper toutes les runtimeexception qui n'ont probablement rien à voir avec le traitement prévu. Les exceptions imprévues doivent remonter jusqu'à un niveau ou on les gère, pas subir un traitement qui ne leur est pas approprié et disparaitre.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir. |
|
|
00
|
|
|
#144 | |||||
|
Membre habitué
![]() Inscription : juin 2004 Messages : 175 ![]() |
Citation:
Citation:
Citation:
la gestion des exceptions reste une science exacte : peu de place pour de "l'a peu près". Le diagnostic n'en sera que plus simple. Citation:
chaque couche/layer encapsule l'exception et celle ci gagne (en traversant chaque couche) en granularité. Au final ma GUI se fiche pas mal de savoir que la BDD est tombé, ou que le réseau dans la DMZ est indisponible. Elle à juste à savoir que le service est indisponible. Citation:
pourquoi avoir un while alors que je peut le simuler avec un for ? du confort
__________________
En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche. (Jacques Rouxel : "Les shadoks") |
|||||
|
|
00
|
|
|
#145 | ||
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
J'avais déjà exprimé mes réticences, mais ça peut être un plus pour la lisibilité, donc vous m'avez convaincu.
Mais il reste le problème du type catché, pour moi soit on indique le type parent à utiliser, soit c'est "Throwable" tout le temps, qui est suffisant dans la plupart des cas. Ce qui dans ce cas donne quelque chose comme: Code :
|
||
|
|
00
|
|
|
#146 | |
![]() ![]() |
Citation:
Une fonction private donc, ce n'est pas la mort à trouver un nom pour une fonction qui traite un cas d'exceptions commun... F.
__________________
Développeur Java / Flex à Shanghai, Chine mes publications Mon dernier tutoriel : Messages Quit IRC : explications La rubrique IRC recrute des redacteurs : contactez moi Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE] |
|
|
|
00
|
|
|
#147 | |
|
Membre habitué
![]() Inscription : juin 2004 Messages : 175 ![]() |
Citation:
Ici on ne cherche pas à regrouper tous les cas d'exception d'une classe vers une seule méthode mais bien de pouvoir faire un regroupement de gestion d'exception suivant leur affinité fonctionnelle/technique. tu te retrouvera donc bien avec un ensemble de méthodes private pour la gestion des exception. Pour ajouter à mon propos, je pense aussi que d'utiliser des méthodes private pose aussi un problème de porté. En effet si je modifie une de ces méthodes private, je peux difficilement dire (et vérifier) si cette modification est bonne pour tous les bloc catch de ma classe qui la pointe. Ici on recherche moins à éviter le copier-coller dans toute une classe que de simplifier et de rendre plus lisible/moins envahissante la gestion des exceptions.
__________________
En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche. (Jacques Rouxel : "Les shadoks") |
|
|
|
00
|
|
|
#148 |
|
Expert Confirmé Sénior
![]() ![]() Développeur d'applications Inscription : novembre 2005 Messages : 2 577 ![]() |
Et encore, ça suppose que la méthode de gestion d'exception n'ait pas besoin de variables ou de références appartenant au contexte de la méthode dans laquelle se trouve le code qui a déclenché l'erreur.
C'est un excellent progrès à mon sens car je trouve que c'est justement sur ce genre de chose que java a du retard par rapport à son concurrent c#. |
|
|
00
|
|
|
#149 | |
![]() ![]() ![]() Inscription : octobre 2003 Messages : 7 920 ![]() |
Citation:
Je suis assez surpris par ta remarque (mais je ne connais pas suffisamment C#). Pourrais tu illustrer ton propos ?
__________________
Hébergement Java et démos - Cours Java - FAQs Java - Blogs Java - Notre sélection d'évènements Java Rejoignez le JUG |
|
|
00
|
|
|
#150 | |||||
|
Expert Confirmé Sénior
![]() ![]() Développeur d'applications Inscription : novembre 2005 Messages : 2 577 ![]() |
Citation:
Pour les cas ou je me fiche de savoir quel est le type de l'exception déclenché mais que je veux juste pouvoir déclencher un rollback ou effectuer un nettoyage (et c'est le cas 9 fois sur 10 dans ma BLL), c'est un gain en code et en lisibilité considérable. En gros on peut faire un code du style : Code :
Code :
Cette nouvelle syntaxe en java permet justement de répondre à tous ces cas ou on se fiche du type exact de l'exception, mais qu'on veut simplement être en mesure de réagir à une erreur avant de propager l'exception plus haut. On fait cela très souvent dans les applications n-tiers, on veut que la couche profonde signale que quelque chose de mauvais est arrivé mais la décision d'arrêter l'application ou de continuer l'exécution après un gentil message d'erreur est prise par la couche de surface. |
|||||
|
|
00
|
|
|
#151 |
|
Membre éprouvé
![]() Inscription : mai 2008 Messages : 440 ![]() |
Je ne vois pas dans ce code quelque chose de plus qu'en Java aujourd'hui :
- On catch une Exception de haut niveau et après on teste le type réel. En Java, pareil catch(Exception e) puis des instanceof - Propagation d'exception, sans rien perdre non plus, mais ok en java il faut rajouter le nom de la variable contenant l'exception, donc "throw ex" dans ton exemple au lieu de "throw". Où est l'avantage du C# ? |
|
|
00
|
|
|
#152 | ||
|
Expert Confirmé Sénior
![]() ![]() Développeur d'applications Inscription : novembre 2005 Messages : 2 577 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#153 |
|
Membre éprouvé
![]() Inscription : mai 2008 Messages : 440 ![]() |
Tes 2 explications sont sur le fait de relancer l'exception.
Le gros catch en C# que tu décrit reste pour moi identique en Java. Maintenant, les "précieuses informations de la pile", et le simple "throw" du C#, je ne vois toujours pas. Si dans ton exemple, le throw propage l'exception, pourquoi ne faudrait-il pas la catcher au niveau supérieur ? Pour la pile, si je choisi de faire un catch, c'est bien justement que je souhaite traiter l'erreur à mon niveau. Pour faire remonter des erreurs de couche en couche, je ne propage jamais l'exception initiale, ca ajoute du couplage inutile entre une couche de présentation et de persistance. Donc systématiquement, j'encapsule et je ne perd pas d'info. Et quand je ne peux pas traiter une exception qui par nature serait irrécupérable, je la propage justement en Runtime. Au final, d'après tes explications, C# et Java sont sensables, ils permettent de faire la même chose, à qq pouillièmes de syntaxe. [Edit] Je ne relancerai pas le topic sur cette apartée, trop éloignée du sujet initial. |
|
|
00
|
|
|
#154 | |||
|
Expert Confirmé Sénior
![]() ![]() Développeur d'applications Inscription : novembre 2005 Messages : 2 577 ![]() |
Citation:
Citation:
Citation:
Ca ferait un excellent débat ça. |
|||
|
|
00
|
|
|
#155 | |||
|
Membre Expert
![]() ![]() Inscription : février 2004 Messages : 1 833 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#156 |
|
Expert Confirmé Sénior
![]() ![]() Développeur d'applications Inscription : novembre 2005 Messages : 2 577 ![]() |
Il me semble que c'est bien le rethrow qui fait l'objet de l'autre proposition. Pas encore regardé d'assez près pour être sûr. Mais vraiment ça y ressemble.
Cette proposition et celle que tu as pointé sont deux solutions acceptables je trouve. Le problème de fond est toujours un peu le même, il y a aucune syntaxe qui permet de laisser l'exception telle quelle tout en ayant la possibilité de réagir à l'erreur ou tout au moins d'éviter la duplication du code de gestion. C'est utile pour tout ce qui ne peut pas se faire avec une clause finally (un rollback dans le cas d'une BDD par ex.). Je trouve que ces nouveautés iraient dans le bon sens, de toutes façons il y a forcément des cas dans lesquels ces choses sont pertinentes et d'autres ou elles ne le sont pas vraiment. |
|
|
00
|
|
|
#157 |
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
Que ce soit dans l'ancienne ou dans la nouvelle syntaxe il ne FAUT PAS catcher directement Exception ou pire: Throwable, mais directement les types que l'on doit traiter.
1. utiliser finally quand on doit faire un traitement avant une sortie d'exception (le rollback le plus souvent) (edit: oops pas le rollback mais la fermeture de connection) 2. faire un catch pour faire ensuite un rethrow sans encapsulation ça n'est pas efficace et inutile: autant faire simple (lancer et catcher une exception est couteux, le instanceOf est également couteux) 3. même si le risque est faible, il y a toujours un risque qu'un traitement d'exception plante et on perd alors l'exception originelle: le traitement est faux. Finalement, le seul cas ou il faut catcher toutes les exception est le plus haut niveau d'un serveur d'application, d'un service, bref quand on traite réellement les exceptions sans les relancer. Il doit y avoir de bien meilleure sources que moi sur le bon usage de l'exception, mais à ma connaissance aucune ne conseille de catcher l'exception. Il faut rappeler ce qui nous semble les "règles de l'art", plutôt que proposer des contournements. en conclusion, cette nouvelle syntaxe nous inciterait à utiliser correctement les exceptions en simplifiant la syntaxe du catch. |
|
|
00
|
|
|
#158 |
|
Expert Confirmé Sénior
![]() ![]() Développeur d'applications Inscription : novembre 2005 Messages : 2 577 ![]() |
-Tu peux tout à fait catcher exception du moment que tu fais une propagation en bonne et due forme et sans perte de l'information, java impose d'éviter ce genre de chose à cause des checked exceptions, mais dans d'autres langages c'est possible et tout à fait propre et sérieux.
-finally ça se déclenche aussi si tout s'est bien passé, c'est l'endroit idéal pour libérer des ressources mais pas pour effectuer un rollback. -Si l'exception est exceptionnelle on s'en fout de perdre même 100ms en rethrow. Typiquement un cas ou on doit faire un rollback ça devrait pas être tous les 2 appels. |
|
|
00
|
|
|
#159 |
|
Expert Confirmé
![]() ![]() Inscription : janvier 2005 Messages : 2 810 ![]() |
Dans ce cas, sa gravité est gravitationnelle.
|
|
|
00
|
|
|
#160 | ||||||
|
Expert Confirmé Sénior
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 666 ![]() |
Citation:
Désolé mais ceci est tout à fait possible en Java également, à une nuance syntaxique près puisqu'il faut faire suivre le throw par la référence de l'exception : Citation:
C'est un choix philosophique de ces deux langages, et chacun ayant ses avantages et ses défauts. Java force les développeurs à gérer les checked-exceptions, tandis qu'en C# on peut ignorer toutes les exception. Mais perso cela importe peu car la qualité de la gestion des exception dépend du développeur et non pas du langage... Citation:
Ce n'est que lorsqu'on crée une nouvelle exception que l'on perd le stacktrace initiale, mais on utilise alors la forme suivante qui permet de passer l'exception cause : Code :
throw new MonException("message", ex); Citation:
a++
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||||||
|
00
|
Copyright © 2000-2013 - www.developpez.com