Alors 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 compile bien et fonctionne comme il se doit, mais il ne semble pas juste de revenir de l'intérieur d'un bloc try, surtout s'il y a enfin un associé.
Mon problème principal est de savoir ce qui se passe si le dernier lance une exception qui lui est propre. Vous avez une variable retournée mais vous avez également une exception à gérer ... alors, j'aimerais savoir ce que les autres pensent du retour d'un bloc try?
Non, ce n'est pas une mauvaise pratique. Placer return
là où cela se justifie améliore la lisibilité et la maintenabilité et rend votre code plus simple à comprendre. Vous ne devriez pas vous inquiéter, car le bloc finally
sera exécuté si une instruction return
est rencontrée.
Enfin, il sera exécuté quoi qu'il arrive, alors peu importe.
Personnellement, j'éviterais ce type de codage, car je n'ai pas envie de voir les déclarations avant les déclarations.
Mon esprit est simple et traite les choses plutôt linéairement. Par conséquent, lorsque je parcourrai le code pour la marche à sec, j’aurai tendance à penser qu’une fois que je peux atteindre la déclaration de retour, peu importe ce qui suit, peu importe ce qui est manifestement très faux dans ce cas (pas que cela affecterait la déclaration de retour mais ce que les effets secondaires pourraient être).
Ainsi, j’arrangerais le code pour que l’instruction return apparaisse toujours après les instructions finally.
Cela peut répondre à votre question
Qu'est-ce qui se passe réellement dans une instruction try {return x;} finally {x = null?}?
À la lecture de cette question, il semble que vous pouvez avoir une autre structure de capture d’essai dans l’instruction finally si vous pensez que cela pourrait renvoyer une exception. Le compilateur déterminera quand renvoyer la valeur.
Cela dit, il serait peut-être préférable de restructurer votre code de toute façon, pour que cela ne vous gêne pas par la suite ou pour quelqu'un d'autre qui l'ignore peut-être également.
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 à analyser. Mais cette objection a plus à voir avec les déclarations de retour qu'avec catch et block.
Dans votre exemple, dans les deux cas, 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 l'instruction return en bloc ou en dehors de celle-ci.
La vraie question est stylistiquement ce qui est le meilleur. J'aime écrire mes méthodes pour qu'il n'y ait qu'une seule instruction return, ainsi il est plus facile de voir le flux sortant de la méthode. Il s'ensuit que j'aime également mettre l'instruction return en dernier, de sorte qu'il est facile de voir que c'est le cas. la fin de la méthode et ce qu’elle retourne.
Je pense qu'avec la déclaration return si bien placée en tant que dernière déclaration, d'autres sont moins susceptibles de venir saupoudrer plusieurs déclarations return dans d'autres parties de la méthode.