|
|||||||
| Débats Les débats et sondages sur le langage et les technologies Java |
|
|
Publicité ' | |||||||||||||||||||||||||||||||||
|
|
|
Outils de la discussion |
|
|
#1 |
|
Expert Confirmé Sénior
![]() ![]() |
Bonjour,
aujourd'hui, je vous propose un sujet de débat. D'après vous, est-ce un anti-pattern d'utiliser une instruction return dans un bloc try / catch / finally ? Faut-il par exemple éviter le return dans la catch? Faut-il éviter le return dans le try? Faut-il éviter le return dans le finally? Dans tous?Si vous avez, au contraire, des arguments à apporter par rapport à votre opinion, et que ceux-ci n'ont pas encore été apporté sur ce fil de discussion, n'hésitez pas fournir votre contribution. Instructions:
__________________
⥀⥁ Чиз 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
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() |
Dans un bloc try:
Pour moi, aucune raison d'éviter le return. Il est préférable de faire un return quand on sais qu'on a fini le travail et qu'on a le résultat (de calcul par exemple) à envoyer, que de stocker ça dans une variable, rajouter dans la suite du code des if pour traiter le cas "on a plus rien à faire mais on a encore plein de code" et finalement finir sa méthode avec un "return resultatDejaCalculeDepuisLongtemps;" Dans le bloc catch: Typiquement, certains cas d'erreur en eux même portent la réponse au calcul pour lequel la méthode est appelée ou sont tellement grave qu'il rendent la suite de l'opération impossible à continuer. Là, l'utilisation peut être tendancieuse. Il faut bien savoir ce que l'on fait. Faut-il ou non avertir l'appelant que la méthode a échoué? Quels moyens ont étés prévu dans le design pour informer l'appelant (return false? Ou lancement d'un autre exception). Suivant ces conditions, il faudra alors envisager soit le return, soit le lancement d'une autre exception.Dans le bloc finally: Ce bloc est "toujours" exécuté, par définition même (quoi que pas toujours intégralement). Deux cas peuvent alors se produire je pense:
__________________
⥀⥁ Чиз 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
|
|
|
#3 | ||
|
Expert Confirmé Sénior
![]() ![]() Développeur Java/Web Inscription : avril 2002 Messages : 12 655 ![]() |
Salut,
Pour le try et le catch, je ne vois pas de soucis particulier. Après bien sûr ca dépend des conventions de codage de chacun... Par contre c'est une grosse erreur de mettre un return dans un bloc finally, car cela peut cacher un return ou même une exception remontée dans le bloc try correspondant. D'ailleurs le compilateur génère un warning dans ce cas... a++ [edit] Grillé... mais tu as oublié de dire qu'un return dans le finally peut également cacher un éventuel return dans le bloc try. Par exemple cette méthode retournera toujours 0 : Code :
__________________
adiGuba [ tutoriels | blog | twitter ] Rédacteur/Modérateur Java |
||
|
00
|
|
|
#4 | ||||
|
Membre expérimenté
![]() David Inscription : décembre 2003 Messages : 475 ![]() |
De part le caractère trompeur du bloc finally pour les return, je l'exclus comme vous des possibilités intéressantes d' y mettre ou non un return à l'intérieur.
De ce postulat, je vois 2 logiques principales: - celle ou on autorise un seul return : donc uniquement après la fin du catch. - celle ou on autorise le catch à tout niveau (hormis finally) donc à la fois dans le try et le catch. La 1ère solution présente généralement la présence d'une variable de sortie commune. Code :
Code :
Faut il ou non sortir d'une méthode voir d'une structure logique avec sa propre mécanique lorsqu'une condition de sortie est satisfaite ? Personnellement, je répond oui car j'en trouve la qualité du code améliorée: - on supprime toute les erreurs possibles que l'on peut faire lorsque l'on partage une variable de sortie commune entre les sorties potentielles et qu'on doit attendre la dernière instruction de la méthode pour sortir. - le code est plus concis dans la mesure ou l'on peut inliner les valeurs retournées. - le code se lit plus rapidement puisque plus d'indirection de lecture liée à l'existence d'une variable de sortie commune
__________________
Ils flottent tous en bas |
||||
|
|
00
|
|
|
#5 |
|
Membre confirmé
![]() ![]() Inscription : juin 2006 Messages : 212 ![]() |
Salut,
Dans ma boite un grand "ponte", nous à pondu des préconisations parmi lesquelles : "1 return au maximum par méthode". Partant de là, je dirai donc qu'il est préférable de ne jamais en mettre dans les try, catch, ou finally. En même temps, je n'ai jamais vraiment compris en quoi mettre plusieurs return dans une même méthode pouvait gêner? Et c'est aussi le même qui nous à pondu une autre règle : "pas plus de 80 caractères par ligne", et là on devine qu'il édite les règles d'après son expérience sur ... cobol, et du coup je ne sais pas dire si il y a réellement une logique derrière cette limitation? Si possible je m'abstiens de mettre des return dans "try" et "finally", et encore plus dans les "catch" où à priori je vois mieux un "throws" qu'un return?
__________________
Plus d'aide sur Jdeveloper? => Version anglaise : http://my.opera.com/Tiftif/blog/ => Version Française : http://blog.developpez.com/index.php?blog=155 |
|
|
00
|
|
|
#6 | |
|
Expert Confirmé Sénior
![]() ![]() |
Citation:
__________________
⥀⥁ Чиз 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
|
|
|
#7 |
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
Je fais confiance aux warnings d'eclipse, et c'est toutes les sorties à partir du finalize qui sont en alerte sous eclipse. ça vaut aussi pour un throw exception dans le finalize.
Donc c'est clairement un antipattern, limite un WTF ![]() par contre, je ne sais pas pourquoi tu as posé la question les return dans un try et un catch, ça c'est du traitement normal. |
|
|
00
|
|
|
#8 | |
|
Membre du Club
![]() Inscription : juillet 2009 Messages : 93 ![]() |
Citation:
![]() Je préfère également n'avoir qu'un seul return, je trouve ça plus lisible et plus proche de ma réflexion: "je tente ça et si ça échoue je détermine l'erreur, puis je retourne un résultat". ou "je fais calcule ça ou ca et je retourne le résultat" Un return dans le code c'est pour moi plus une astuce d'optimisation qui sacrifie un peu de facilité de lecture. Mon soucis vis-à-vis de cette discussion c'est que je ne vois pas vraiment de cas ou on ait besoin de setter quelque chose dans un catch. Si je catch une exception, c'est que l'application a eu un comportement anormal et du coup, ce que je set dans le bloc catch sera plus une constante qui décrit le problème (donc pas de soucis pour déterminer qui set quoi), mais je vais surtout up mes log. Je préfère d'ailleurs retourner un null lors d'une levé d'exception, comme ça pas de doute |
|
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() |
bien sur dans le final (et pas finalize!!!) SURTOUT pas de throw ou de return dedans!! Ca cacherais l'exception en cours de propagation.
__________________
⥀⥁ Чиз 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
|
|
|
#10 |
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
Oops, ah oui, c'est du finally dont je parlais, pas du finalize.
bref l'anti-pattern pourrais faire l'objet d'une belle question piège pour les entretiens de recrutement, quoiqu'il soit sans doute plus utile de connaitre les bonnes méthodes que les mauvaises, notamment que faire dans le catch, quelle Exception catcher. |
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 1 013 ![]() |
On m'a aussi dit au début "surtout, un seul return par méthode, sinon c'est illisible".
Très rapidement je suis passé outre - parce que je trouvais ça tellement plus lisible avec plusieurs returns qu'avec un stockage dans une variable qu'on teste à chaque bloc pour voir si elle est pas vide. Par ailleurs les classes java.lang sont pleines d'exemples de multi-return, ça m'a donné un argument contre les "pontes"
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com