11 Stimmen

Ist dieses "Versuchen fangen endlich" überflüssig?

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } catch (Exception e) {
        throw e;
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}

Verhält sich dies anders, als wenn wir die catch-Klausel weglassen würden?

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}

[Um die Verwirrung zu klären: Ja, die catch Block tut nichts, außer die Ausnahme erneut auszulösen. Ich habe mich gefragt, ob dies eine Art von unterschiedlicher Reihenfolge verursacht, wenn die finally Block aufgerufen wird (unter der Annahme, dass die geworfene Ausnahme vom Aufrufer abgefangen wird), aber aus dem, was ich aus den bisherigen Antworten schließe, ist das nicht der Fall.

7voto

Michael Barker Punkte 13553

Sie sind identisch. Ich würde die zweite Version verwenden.

5voto

Kal Punkte 24349

Ja. Da Ihre Methode bereits eine "Exception" auslöst, brauchen Sie sie nicht abzufangen und erneut auszulösen. Es sei denn, Sie wollen das tun, was @Dave erwähnt hat.

3voto

Nathan Ryan Punkte 12507

Obwohl die beiden Quellcodes dieselbe Ausführungssequenz darstellen, führen sie zu unterschiedlichem Bytecode. Die erste Routine hat z.B. eine Ausnahmetabelle, die zweite nicht. Ihr Bytecode hat bei der Ausführung die gleiche Wirkung, wenn keine Instrumentierung vorhanden ist. Es ist möglich dass sich diese Methoden anders verhalten, wenn der Bytecode nach der Kompilierung instrumentiert wird oder wenn die abgefangene Ausnahme von einem Typ ist, dessen Klassendatei während der Ausführung nicht verfügbar ist.

2voto

fmucar Punkte 14031

Da Sie die Ausnahme, die Sie in der catch-Klausel gefangen haben, auslösen und nichts anderes tun, als sie erneut auszulösen, werden beide Codes dasselbe tun.

1voto

Jan Zyka Punkte 16711

Sie haben Recht, es ist dasselbe. Sogar der Stacktrace wird vorhanden sein :)

Aber ein ähnlicher Code könnte verwendet werden, wenn Sie die Ausnahme in eine höhere Ebene einpacken. Wenn der Code genau wie angegeben aussieht, ist es wirklich sinnlos.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X