Question

Alors, ce matin, je suis tombé sur du code 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 finalement un associé.

Mon principal problème est de savoir ce qui se passe si le programme lance une exception qui lui est propre. Vous avez une variable renvoyée, mais vous avez également une exception à traiter. Je suis donc intéressé de savoir ce que les autres pensent du retour dans un bloc try?

Était-ce utile?

La solution

Non, ce n'est pas une mauvaise pratique. Le fait de placer return là où cela a du sens améliore la lisibilité et la maintenabilité et rend le code plus simple à comprendre. Ne vous inquiétez pas, car le bloc finally sera exécuté si une instruction return est rencontrée.

Autres conseils

Enfin, il sera exécuté quoi qu'il arrive, donc ce n'est pas grave.

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 j’aurai atteint la déclaration de retour, peu importe ce qui suit, peu importe ce qui est manifestement très faux dans ce cas (cela n’affectera pas 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

Ce qui se passe réellement dans un essayez {return x; } finally {x = null; } déclaration?

En lisant 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 générer 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 ne pas vous embrouiller plus tard ou pour quelqu'un d'autre qui pourrait ne pas en être conscient.

Sur le plan fonctionnel, 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 que les commandes catch et block finalement.

Dans votre exemple, dans les deux cas, c'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 quelle est la meilleure. J'aime écrire mes méthodes de manière à ce 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 aussi mettre l'instruction return en dernier, de sorte qu'il est facile de voir qu'elle est la fin de la méthode et ce qu’elle renvoie.

Je pense qu'avec la déclaration return si bien placée comme dernière instruction, d'autres sont moins susceptibles de venir saupoudrer plusieurs instructions return dans d'autres parties de la méthode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top