Est-ce une mauvaise pratique de rentrer à l’intérieur d’un essai?

Donc je suis tombé sur du code ce matin qui ressemblait à ceci:

try { x = SomeThingDangerous(); return x; } catch (Exception ex) { throw new DangerousException(ex); } finally { CleanUpDangerousStuff(); } 

Maintenant, ce code comstack bien et fonctionne comme il se doit, mais il ne semble pas juste de revenir depuis un bloc try, surtout s’il y a finalement un associé.

Mon principal problème est que se passe-t-il si le dernier lance une exception? Vous avez une variable renvoyée mais aussi une exception à traiter. Je suis donc intéressée de savoir ce que les autres pensent du retour dans un bloc try?

Non, ce n’est pas une mauvaise pratique. Mettre le return là où il est judicieux améliore la lisibilité et la maintenabilité et rend votre code plus simple à comprendre. Vous ne devriez pas vous en soucier, car finally bloc sera exécuté si une déclaration de return est rencontrée.

Les derniers seront exécutés quoi qu’il arrive, alors ce n’est pas grave.

Personnellement, j’éviterais ce genre de codage car je n’ai pas envie de voir des déclarations de retour avant les déclarations finales.

Mon esprit est simple et il traite les choses plutôt linéairement. Par conséquent, quand je passerai en revue le code de marche à sec, j’aurai tendance à penser qu’une fois que j’aurai atteint la déclaration de retour, tout ce qui suit n’a pas d’importance, même si cela n’affecte pas la déclaration de retour. quels pourraient être les effets secondaires).

Ainsi, j’arrangerais le code pour que la déclaration de retour apparaisse toujours après les instructions finally.

Cela peut répondre à votre question

Que se passe-t-il réellement dans un try {return x; } finalement {x = null; } déclaration?

À la lecture de cette question, il semble que vous puissiez avoir une autre structure try catch dans l’instruction finally si vous pensez qu’elle pourrait générer une exception. Le compilateur déterminera quand retourner la valeur.

Cela dit, il serait peut-être préférable de restructurer votre code de toute façon, afin de ne pas vous confondre plus tard ou avec quelqu’un d’autre qui pourrait ne pas en être informé.

Fonctionnellement, il n’y a pas de différence.

Cependant, il y a une raison pour ne pas le faire. Les méthodes plus longues comportant plusieurs points de sortie sont souvent plus difficiles à lire et à parsingr. Mais cette objection a plus à voir avec les déclarations de retour que les blocs catch et finally.

Dans votre exemple, de toute façon est équivalent, je ne serais même pas surpris si le compilateur générait le même code. Si une exception se produit dans le bloc finally, vous rencontrez les mêmes problèmes, que vous placiez la déclaration de retour en bloc ou en dehors de celle-ci.

La vraie question est stylistiquement ce qui est le mieux. J’aime écrire mes méthodes pour qu’il n’y ait qu’une seule déclaration de retour, de cette façon il est plus facile de voir le stream sortant de la méthode, il s’ensuit que j’aime aussi mettre la déclaration de retour en fin de compte. la fin de la méthode et c’est ce qu’elle renvoie.

Je pense qu’avec la déclaration de retour si bien placée comme la dernière déclaration, d’autres sont moins susceptibles de venir saupoudrer plusieurs déclarations de résultats dans d’autres parties de la méthode.