Est-ce une mauvaise pratique de retour dans un try catch enfin bloquer?
Donc, je suis tombé sur un certain code, ce matin, qui ressemblait à ceci:
try
{
x = SomeThingDangerous();
return x;
}
catch (Exception ex)
{
throw new DangerousException(ex);
}
finally
{
CleanUpDangerousStuff();
}
Maintenant ce code compile fine et fonctionne comme il se doit, mais il n'a tout simplement pas se sentir le droit de retour à partir de l'intérieur d'un bloc try, surtout si il ya un associé enfin.
Ma principale question est de savoir ce qui se passe si les enfin, déclenche une exception de lui-même? Vous avez en retour une variable, mais également une exception à gérer... donc, je suis intéressé de savoir ce que les autres pensent de retour à partir de l'intérieur d'un bloc try?
- Un des avantages de ce style est que vous n'avez pas à déclarer
x
à l'extérieur de latry
bloc. Vous pouvez garder sa déclaration à proximité de son utilisation.
Vous devez vous connecter pour publier un commentaire.
Non, ce n'est pas une mauvaise pratique. Mettre
return
où il fait sens, améliore la lisibilité et la maintenabilité et rend votre code plus simple à comprendre. Vous ne devriez pas les soinsfinally
bloc sera exécuté que si unreturn
instruction est rencontrée.La enfin être exécuté de n'importe quoi, donc il n'a pas d'importance.
Personnellement, je vous conseille d'éviter ce genre de code que je n'ai pas envie de voir le retour des déclarations avant de finalement consolidés.
Mon esprit, c'est simple et c'processus des choses plutôt linéaire. Donc quand je marche à travers le code de fonctionnement à sec, j'aurai tendance à penser qu'une fois que je peux arriver à l'instruction de retour, tout suivre n'est pas n'importe qui, évidemment, est assez mauvais dans ce cas (non pas que cela aurait une incidence sur l'instruction de retour mais quels sont les effets secondaires pourraient être).
Ainsi, je voudrais organiser le code de sorte que l'instruction de retour apparaissent toujours après le enfin consolidés.
Cela peut répondre à votre question
Ce qui se passe vraiment dans un try { return x; } finally { x = null; } déclaration?
À la lecture de cette question, il semble que vous pouvez faire une autre tentative de capture de la structure dans l'instruction enfin si vous pensez qu'il peut lever une exception. Le compilateur va comprendre quand le retour de la valeur.
Cela dit, il pourrait être préférable de restructurer votre code de toute façon juste pour ne pas vous embrouiller plus tard, ou quelqu'un d'autre qui peut être pas au courant de ce que bien.
Fonctionnellement il n'y a pas de différence.
Cependant, il ya une raison pour ne pas faire cela. Plus les méthodes avec plusieurs points de sortie sont souvent plus difficiles à lire et à analyser. Mais cette objection a plus à voir avec le retour des déclarations de capture et enfin blocs.
Dans votre exemple est équivalent, je ne serais même pas surpris si le compilateur a généré le même code. Si une exception se produit dans le bloc finally, vous avez les mêmes problèmes, si vous mettez l'instruction de retour en bloc ou à l'extérieur.
La vraie question est de style qui convient le mieux. J'aime écrire mes méthodes de sorte qu'il n'existe qu'une instruction de retour, de cette façon il est plus facile de voir le flux de la méthode, il s'ensuit aussi que je tiens à mettre l'instruction return dernier de sorte qu'il est facile de voir que c'est la fin de la méthode, et ce de quoi il en retourne.
Je pense qu'avec l'instruction de retour si habilement placé que la dernière instruction, d'autres le sont moins susceptibles de venir et saupoudrer de multiples retours états dans d'autres parties de la méthode.