it-swarm.com.de

Ist es sinnvoll, "try-finally" ohne "catch" zu machen?

Ich habe einen Code wie diesen gesehen:

    try
    {
        db.store(mydata);
    }
    finally
    {
        db.cleanup();
    }

Ich dachte, try soll eine catch haben?

Warum macht dieser Code so?

106
glanden

Dies ist nützlich, wenn Sie möchten, dass die aktuell ausgeführte Methode immer noch die Ausnahme auslöst und die Ressourcen entsprechend bereinigt werden. Nachfolgend 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();
    }
}
155
Taylor Leese

Es ist da, weil der Programmierer sicherstellen wollte, dass db.cleanup() aufgerufen wird, auch wenn der Code im try-Block eine Ausnahme auslöst. Ausnahmen werden von diesem Block nicht behandelt, aber erst nach der Ausführung des finally-Blocks nach oben weitergegeben.

67
Matti Virkkunen

Warum macht dieser Code so?

Weil der Code anscheinend nicht mit Ausnahmen auf dieser Ebene umgehen kann. Das ist in Ordnung - solange einer der Anrufer dies tut, d. H. Solange die Ausnahme schließlich irgendwo behandelt wird.

Low-Level-Code kann häufig nicht angemessen auf Ausnahmen reagieren, da der Benutzer benachrichtigt werden muss oder die Ausnahme protokolliert werden muss oder eine andere Strategie versucht wird. Low-Level-Code führt nur die Funktion one aus und weiß nichts über die Entscheidungsfindung auf höherer Ebene.

Der Code muss jedoch immer noch seine Ressourcen bereinigen (da dies nicht der Fall wäre, würden sie auslaufen). In der finally-Klausel wird genau das getan, um sicherzustellen, dass always immer auftritt, ob eine Ausnahme ausgelöst wurde oder nicht.

20
Konrad Rudolph

Der finally-Block stellt sicher, dass der Aufruf von db.cleanup() auch dann ausgeführt wird, wenn eine RuntimeException ausgelöst wird (möglicherweise aufgrund eines Fehlers im aufgerufenen Code).

Dies wird auch häufig verwendet, um zu viel Verschachteln zu verhindern:

try
{
    if (foo) return false;
    //bla ...
    return true;
}
finally
{
    //clean up
}

Insbesondere wenn die Methode an vielen Stellen wiedergegeben wird, verbessert dies die Lesbarkeit, da jeder sehen kann, dass der Bereinigungscode in jedem Fall aufgerufen wird.

2
FRotthowe

Wenn der Code im try-Block eine geprüfte Ausnahme auslösen kann, muss er in der throws-Klausel der Methodensignatur angezeigt werden. Wenn eine nicht geprüfte Ausnahme ausgelöst wird, wird sie aus der Methode ausgeblasen.

Der finally-Block wird immer ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst wird oder nicht.

0
THINESH VASEE

Der Code sorgt dafür, dass die Datenbank geschlossen wird.
Normalerweise besteht die Art und Weise, wie Sie dies tun würden, darin, den gesamten Code für den Zugriff auf Ihre Datenbank in den try-Block zu setzen, und dann einen Aufruf zum Schließen der Datenbank im finally-Block zu geben.
Die Art und Weise, wie try ... endlich funktioniert, bedeutet, dass der Code im try-Block ausgeführt wird und der Code im finally-Block ausgeführt wird, wenn der Vorgang abgeschlossen ist ... egal was passiert.
Wenn der Computer aus der Wand gezogen wird, wird er ausgeführt.
Dies bedeutet, dass selbst wenn eine Ausnahme aufgerufen wird und die Ausführung der Methode drei Jahre dauert, sie immer noch im finally-Block gespeichert wird und die Datenbank geschlossen wird. 

0
chustar