Ich denke, Willenscode kommt dem Ausdruck des Schlüsselpunkts hier am nächsten, und wahrscheinlich meint es jeder, ist aber nicht klar.
Das Problem ist, dass tatsächlich etwas sehr falsch mit dem ist, was Sie fragen: "Wenn ich alle Anweisungen nach dem catch-Block schreibe, anstatt sie in den finally-Block zu schreiben, dann stimmt dann etwas nicht?"
Wenn Sie alle Anweisungen nach dem catch-Block schreiben, implizieren Sie dies
1) Sie werden immer die Ausnahme abfangen.
2) Sie fahren immer mit den nächsten Anweisungen fort, nachdem Sie die Ausnahme abgefangen haben.
Dies bedeutet, dass Sie die Ausführung nach einer Ausnahme immer "normal" fortsetzen, was im Allgemeinen etwas ist, was Sie eigentlich nie tun möchten.
Ausnahmen sollten genau das sein - außergewöhnlich. Wenn Sie tatsächlich eine Ausnahme behandeln können, ist es immer besser, Ihren Code zu schreiben, um diese Bedingungen zuerst zu berücksichtigen und überhaupt nicht zu einer Ausnahme zu führen. Wenn Sie diesem Modell folgen, sind Ausnahmen wirklich außergewöhnlich - Bedingungen, die Sie nicht vorhersehen oder höchstens nicht beheben konnten. Wirklich nicht vorwegzunehmen ist, worauf Sie hinarbeiten sollten. Dies bedeutet im Allgemeinen, dass Sie keine echten Ausnahmen verarbeiten können. Dies bedeutet auch, dass Sie die Ausführung nicht einfach fortsetzen sollten, sondern häufig die Anwendung beenden.
Normalerweise wird zugelassen, dass ein Fehler den Aufrufstapel wieder weitergibt. Einige sagen, dass dies mit der Möglichkeit geschieht, dass jemand weiter oben in der Kette damit umgehen kann. Ich würde sagen, dass im Wesentlichen nie passiert, es gibt zwei wirkliche Zwecke, um dies zu tun. Zum einen kann der Benutzer dies beheben, falls es eines gibt. Sie geben den Fehler also wieder weiter, bis Sie dort sind, wo Sie ihn dem Benutzer melden können. Oder zweitens kann ein Benutzer das Problem nicht beheben, aber Sie möchten den gesamten Aufrufstapel zum Debuggen abrufen. Dann fangen Sie es oben, um anmutig zu scheitern.
Der finally-Block sollte jetzt mehr Bedeutung für Sie haben. Wie jeder sagt, läuft es immer. Die klarste Verwendung eines Endlich ist wirklich ein Versuch ... Endlich zu blockieren. Was Sie jetzt sagen, ist, wenn der Code gut läuft, großartig. Wir müssen noch etwas aufräumen und das wird schließlich immer ausgeführt, dann gehen wir weiter. Aber wenn eine Ausnahme auftritt, brauchen wir diesen endgültigen Block jetzt wirklich, da wir möglicherweise noch einige Aufräumarbeiten durchführen müssen, aber wir fangen die Ausnahme hier nicht mehr ab, sodass wir nicht mehr weitermachen werden. Der endgültige Block ist wichtig, um sicherzustellen, dass die Bereinigung erfolgt.
Die Idee einer Ausnahme, die die Ausführung immer stoppt, kann für jemanden schwer zu verstehen sein, bis er eine gewisse Erfahrung hat, aber das ist in der Tat die Art und Weise, Dinge immer zu tun. Wenn ein Fehler aufgetreten ist, war er entweder so geringfügig, dass Sie ihn zunächst hätten berücksichtigen müssen, oder es warten immer mehr Fehler auf Sie.
Fehler "schlucken" - sie zu fangen und weiterzumachen ist das Schlimmste, was Sie tun können, weil Ihr Programm unvorhersehbar wird und Sie keine Fehler finden und beheben können.
Gut geschriebener Code enthält so viele try ... finally-Blöcke wie nötig, um sicherzustellen, dass Ressourcen unabhängig vom Ergebnis immer freigegeben werden. Gut geschriebener Code enthält jedoch im Allgemeinen nur eine geringe Anzahl von try ... catch-Blöcken, die in erster Linie vorhanden sind, damit eine Anwendung so ordnungsgemäß wie möglich fehlschlägt oder an den Benutzer zurückgestellt wird, was bedeutet, dass zumindest immer eine Nachricht an den Benutzer usw. weitergeleitet wird. Aber normalerweise fängt man nicht nur einen Fehler und macht weiter.