Ceci est une question connexe Q: Est-ce que l'utilisation de la clause finally pour effectuer un travail après un mauvais style de retour est dangereuse?
Dans le Q référencé, le code finalement est lié à la structure utilisée et à la nécessité de la prélecture. Ma question est un peu différente, et je pense qu'elle est pertinente pour un public plus large. Mon exemple particulier est une application Winform C #, mais cela s'appliquerait également à l'utilisation C ++ / Java.
Je remarque pas mal de blocs try-catch-finally où il y a beaucoup de code sans rapport avec les exceptions et la gestion / nettoyage des exceptions enfouies dans le bloc. Et j'admettrai mon parti pris pour avoir des blocs try-catch-finally très serrés avec le code étroitement lié à l'exception et à la gestion. Voici quelques exemples de ce que je vois.
Les blocs try auront beaucoup d'appels et de variables préliminaires définis menant au code qui pourrait être lancé. Les informations de journalisation seront également configurées et exécutées dans le bloc try.
Enfin, les blocs auront des appels de formatage / module / contrôle (bien que l'application soit sur le point de se terminer, comme indiqué dans le bloc catch), ainsi que la création de nouveaux objets tels que des panneaux.
Grossièrement:
methodName (...) { essayer { // Beaucoup de code pour la méthode ... // code qui pourrait lancer ... // Beaucoup plus de code pour la méthode et un retour ... } attraper (quelque chose) {// gérer l'exception} enfin { // un nettoyage dû à une exception, fermant les choses // plus de code pour le contenu créé (en ignorant que des exceptions auraient pu être levées) ... // peut-être créer d'autres objets } }
Le code fonctionne, il a donc une certaine valeur. Il n'est pas bien encapsulé et la logique est un peu compliquée. Je suis (douloureusement) familier avec les risques liés au changement de code et à la refactorisation, donc ma question se résume à vouloir connaître l'expérience des autres avec un code de structure similaire.
Le mauvais style justifie-t-il les changements? Quelqu'un a-t-il été gravement brûlé d'une situation similaire? Souhaitez-vous partager les détails de cette mauvaise expérience? Laissez-le parce que je réagis de manière excessive et ce n'est pas si mal que ça de style? Bénéficier des avantages de l'entretien de ranger les choses?
finally
passe en C #). Qu'est-ce que l'équivalent C ++? Ce à quoi je pense, c'est du code après le catch
, et cela s'applique de la même manière pour le code après le C # finally
.
Environment.FailFast()
; il peut ne pas être exécuté si vous avez une exception non capturée. Et cela devient encore plus compliqué si vous avez un bloc d'itérateur avec finally
lequel vous itérez manuellement.
finally
. Toutes les bonnes utilisations sont couvertes par RAII / RRID / SBRM (selon l'acronyme que vous aimez).