Dies ist eine verwandte Frage: Ist die Verwendung der finally-Klausel für die Ausführung von Arbeiten nach der Rückkehr ein schlechter Stil / gefährlich?
In dem referenzierten Q bezieht sich der endgültige Code auf die verwendete Struktur und die Notwendigkeit des Vorabrufens. Meine Frage ist etwas anders und ich glaube, dass sie für das breitere Publikum von Bedeutung ist. Mein spezielles Beispiel ist eine C # Winform-App, aber dies würde auch für die endgültige Verwendung von C ++ / Java gelten.
Ich bemerke einige Try-Catch-finally-Blöcke, in denen viel Code enthalten ist, der nichts mit Ausnahmen und Ausnahmebehandlung / Bereinigung zu tun hat. Und ich gebe meine Neigung zu sehr engen Try-Catch-End-Blöcken mit dem Code zu, der eng mit der Ausnahme und der Behandlung zusammenhängt. Hier sind einige Beispiele von dem, was ich sehe.
In Try-Blöcken werden viele vorläufige Aufrufe und Variablen festgelegt, die zu dem Code führen, der ausgelöst werden könnte. Die Protokollinformationen werden eingerichtet und auch im try-Block ausgeführt.
Schließlich erhalten Blöcke Formatierungsaufrufe für Formulare / Module / Steuerelemente (obwohl die App kurz vor dem Beenden steht, wie im catch-Block angegeben) sowie neue Objekte wie Bedienfelder.
Grob:
methodName (...) { Versuchen { // Viel Code für die Methode ... // Code, der werfen könnte ... // Viel mehr Code für die Methode und eine Rückgabe ... }} fangen (etwas) {// Ausnahme behandeln} schließlich { // einige Aufräumarbeiten aufgrund von Ausnahmen, Dinge schließen // mehr Code für das erstellte Material (ignoriert, dass Ausnahmen ausgelöst haben könnten) ... // vielleicht noch ein paar Objekte erstellen }} }}
Der Code funktioniert, daher hat er einen gewissen Wert. Es ist nicht gut gekapselt und die Logik ist etwas verschlungen. Ich bin (schmerzlich) mit den Risiken beim Verschieben von Code sowie beim Refactoring vertraut, daher läuft meine Frage darauf hinaus, die Erfahrungen anderer mit ähnlich strukturiertem Code kennen zu wollen.
Rechtfertigt der schlechte Stil die Änderungen? Wurde jemand aus einer ähnlichen Situation schwer verbrannt? Möchten Sie die Details dieser schlechten Erfahrung mitteilen? Lass es sein, weil ich überreagiere und es nicht so schlecht im Stil ist? Erhalten Sie die Wartungsvorteile beim Aufräumen?
finally
in C # funktioniert). Was ist das C ++ - Äquivalent? Was ich denke, ist Code nach dem catch
, und das gilt auch für Code nach dem C # finally
.
Environment.FailFast()
. Es kann möglicherweise nicht ausgeführt werden, wenn Sie eine nicht erfasste Ausnahme haben. Und es wird noch komplizierter, wenn Sie einen Iteratorblock haben, mit finally
dem Sie manuell iterieren.
finally
. Alle guten Verwendungen werden unter RAII / RRID / SBRM (welches Akronym Sie möchten) abgedeckt.