Soweit ich das beurteilen kann, dienen beide folgenden Codefragmente demselben Zweck. Warum überhaupt finally
Blöcke?
Code A:
try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }
Code B:
try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
Antworten:
Throwable
...)Ein
finally
Block stellt sicher, dass er ausgeführt wird, unabhängig davon, wie Sie diesen Block verlassen (modulo einige Möglichkeiten, den gesamten Prozess explizit abzubrechen). Das ist wichtig für die deterministische Bereinigung von Ressourcen.quelle
System.exit()
AufrufBeachten Sie, dass (zumindest in Java, wahrscheinlich auch in C #) es auch möglich ist, einen
try
Block ohne acatch
, aber mit a zu habenfinally
. Wenn eine Ausnahme imtry
Block auftritt, wird der Code imfinally
Block ausgeführt, bevor die Ausnahme höher ausgelöst wird:quelle
Möglicherweise möchten Sie den Code einfügen, der ohnehin ausgeführt werden soll, unabhängig davon, was in Ihrem Try- oder Catch-Block passiert.
Auch wenn Sie mehrere catch verwenden und einen Code einfügen möchten, der für alle catch-Blöcke gleich ist, ist dies ein Ort zum Einfügen. Sie können jedoch nicht sicher sein, ob der gesamte versuchte Code ausgeführt wurde.
Beispielsweise:
quelle
Schließlich wird immer ausgeführt, wo als Ihr Code nach dem Fang möglicherweise nicht.
quelle
Obwohl unsere Anwendung zwangsweise geschlossen wird, müssen einige Aufgaben ausgeführt werden (z. B. Speicherfreigabe, Schließen der Datenbank, Freigabesperre usw.). Wenn Sie diese Codezeilen in den
finally
Block schreiben , wird ausgeführt, ob eine Ausnahme ausgelöst wird oder nicht...Ihre Anwendung kann eine Sammlung von Threads sein,
Exception
beendet den Thread, aber nicht die gesamte Anwendung. In diesem Fallfinally
ist dies nützlicher.In einigen Fällen
finally
werden keine Ausführungen ausgeführt, z. B. JVM-Fehler, Thread-Beendigung usw.quelle
Weil Sie diesen Code benötigen, um unabhängig von möglichen Ausnahmen ausgeführt zu werden. Beispielsweise müssen Sie möglicherweise eine nicht verwaltete Ressource bereinigen (das Konstrukt 'using' wird zu einem try / finally-Block kompiliert).
quelle
Es kann vorkommen, dass Sie einen Code ausführen möchten, egal was passiert. Gibt an, ob eine Ausnahme ausgelöst wird oder nicht. Dann benutzt man
finally
.quelle
finally
Wird IMMER ausgeführt, es sei denn, die JVM wurde heruntergefahren,finally
bietet nur eine Methode, um den Bereinigungscode an einer Stelle zu platzieren.Es wäre zu langweilig, wenn Sie den Bereinigungscode in jeden der
catch
Blöcke einfügen müssten .quelle
Wenn der catch-Block eine Ausnahme auslöst, wird der verbleibende Code nicht ausgeführt, daher müssen wir den endgültigen Block schreiben.
quelle
Schließlich kann Block in Java verwendet werden, um "Bereinigungs" -Code wie das Schließen einer Datei, das Schließen der Verbindung usw. einzufügen.
Der finally-Block wird nicht ausgeführt, wenn das Programm beendet wird (entweder durch Aufrufen von System.exit () oder durch Verursachen eines schwerwiegenden Fehlers, der zum Abbruch des Prozesses führt).
quelle
Scrollen Sie immer noch nach unten? Bitte schön!
Diese Frage hat mir vor einiger Zeit eine schwere Zeit bereitet.
Was würde im obigen Szenario gedruckt? Ja hat es richtig erraten:
ex.Message - was auch immer es ist (wahrscheinlich versuchte Division durch Null)
Schließlich blockieren
Nach endlich
Was würde dieser Druck? Nichts! Es wird ein Fehler ausgegeben, da der catch-Block einen Fehler ausgelöst hat.
In einer guten Programmierstruktur würden Ihre Ausnahmen in dem Sinne weitergeleitet, dass dieser Code von einer anderen Ebene verarbeitet wird. Um einen solchen Fall zu stimulieren, versuche ich diesen Code.
In diesem Fall wäre die Ausgabe:
Es ist klar, dass der Code nach dem Auslösen nicht ausgeführt wird, wenn Sie eine Ausnahme abfangen und erneut in andere Ebenen werfen (Trichter). Es verhält sich ähnlich wie eine Rückgabe innerhalb einer Funktion.
Sie wissen jetzt, warum Sie Ihre Ressourcen nicht nach dem catch-Block für Codes schließen müssen. Platzieren Sie sie im finally-Block.
quelle