Antworten:
Dies ist nützlich, wenn die aktuell ausgeführte Methode die Ausnahme weiterhin auslösen soll, während Ressourcen ordnungsgemäß bereinigt werden können. Im Folgenden finden Sie ein konkretes Beispiel für die Behandlung der Ausnahme von einer aufrufenden Methode.
public void yourOtherMethod() {
try {
yourMethod();
} catch (YourException ex) {
// handle exception
}
}
public void yourMethod() throws YourException {
try {
db.store(mydata);
} finally {
db.cleanup();
}
}
catch
Block vorhanden ist, wird die eingeworfene Ausnahme finally
vor einer Ausnahme im try
Block ausgeführt. Wenn es also zwei Ausnahmen gibt, eine in try
und eine in finally
der einzigen Ausnahme, die ausgelöst wird, ist die in finally
. Dieses Verhalten ist in PHP und Python nicht dasselbe, da beide Ausnahmen in diesen Sprachen gleichzeitig ausgelöst werden und die Reihenfolge der Ausnahmen try
zuerst und dann ist finally
.
Es ist da, weil der Programmierer sicherstellen wollte, dass db.cleanup()
es aufgerufen wird, auch wenn der Code im try-Block eine Ausnahme auslöst. Ausnahmen werden von diesem Block nicht behandelt, aber erst nach Ausführung des finally-Blocks nach oben weitergegeben.
try
ist nur da, um das zu ermöglichen finally
. Ausnahmen werden nicht erfasst.
Warum macht dieser Code das so?
Denn anscheinend weiß der Code nicht, wie er mit Ausnahmen auf dieser Ebene umgehen soll. Das ist gut - solange einer der Anrufer dies tut, dh solange die Ausnahme letztendlich irgendwo behandelt wird.
Low-Level-Code kann häufig nicht angemessen auf Ausnahmen reagieren, da der Benutzer benachrichtigt oder die Ausnahme protokolliert oder eine andere Strategie ausprobiert werden muss. Low-Level-Code führt eine aus Funktion aus und weiß nichts über Entscheidungen auf höherer Ebene.
Der Code muss jedoch noch seine Ressourcen bereinigen (denn wenn dies nicht der Fall ist, würden sie auslaufen). Dies geschieht genau in der finally
Klausel, um sicherzustellen, dass es immer passiert, ob eine Ausnahme ausgelöst wurde oder nicht.
Der finally-Block stellt sicher, dass auch dann, wenn eine RuntimeException ausgelöst wird (möglicherweise aufgrund eines Fehlers im aufgerufenen Code), die db.cleanup()
Aufruf .
Dies wird auch häufig verwendet, um zu viel Verschachtelung zu verhindern:
try
{
if (foo) return false;
//bla ...
return true;
}
finally
{
//clean up
}
Insbesondere wenn es viele Punkte gibt, an denen die Methode zurückgegeben wird, verbessert dies die Lesbarkeit, da jeder sehen kann, dass der Bereinigungscode in jedem Fall aufgerufen wird.
Der Code tut dies, um sicherzustellen, dass die Datenbank geschlossen ist.
Normalerweise müssen Sie den gesamten Code für den Datenbankzugriff in den try-Block einfügen und dann einen Aufruf zum Schließen der Datenbank im finally-Block ausführen.
Die Art und Weise, wie try ... finally funktioniert, bedeutet, dass der Code im try-Block ausgeführt wird und der Code im finally-Block ausgeführt wird, wenn dies abgeschlossen ist ... egal was passiert.
Kurz bevor der Computer von der Wand gerissen wird, wird der Computer schließlich ausgeführt.
Dies bedeutet, dass selbst wenn eine Ausnahme aufgerufen wird und die Ausführung der Methode drei Jahre dauert, diese weiterhin im finally-Block gespeichert wird und die Datenbank geschlossen wird.
Wenn einer der Codes im try-Block eine aktivierte Ausnahme auslösen kann, muss er in der throw-Klausel der Methodensignatur erscheinen. Wenn eine nicht aktivierte Ausnahme ausgelöst wird, wird sie aus der Methode entfernt.
Der finally-Block wird immer ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst wird oder nicht.
fopen