Rethrow exception in java
Ich habe eine sehr einfache Frage zu re-throwing exception in Java.
Hier ist der Codeausschnitt:
public static void main(String[] args) throws FileNotFoundException {
try {
FileReader reader = new FileReader("java.pdf");
} catch (FileNotFoundException ex) {
throw ex;
}
}
public static void main(String[] args) throws FileNotFoundException {
FileReader reader = new FileReader("java.pdf");
}
Warum brauchen wir, um wieder werfen ex
in der ersten version, während die zweite version sieht eleganter? Was könnten die Vorteile und welche version wird bevorzugt über den anderen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie richtig. Zweite version ist besser. Darüber hinaus ist die erste version macht keinen Sinn. Es bedeutet das gleiche, außer der stack-trace der exception wird "falsch".
Gibt es die folgenden Gründe, um "re-throw" Ausnahmen:
Beispiel:
java.lang.Throwable
In dem Beispiel gegeben, wieder werfen die
Exception
dient keinem Zweck.Tun dies kann nützlich sein, wenn die Methode, das fängt dann wieder wirft die exception muss einige zusätzliche Aktion nach dem sehen der
Exception
, und wünscht sich auch, dass dieException
weitergegeben wird, an den Aufrufer, so dass der Anrufer sehen kann, dieException
und auch einige Maßnahmen ergreifen.finally{}
block.finally
ist immer ausgeführt. Also, @smcg Beispiel für die Protokollierung der Ausnahme: ich will nur den log-Eintrag in dercatch
, aber nicht, wenn dieException
nicht passieren. Wenn es in derfinally
werde ich immer den log Eintrag auch dann, wenn keineException
geworfen wirdIch würde Sie nur fangen/rethrow eine Ausnahme (anstelle von nur werfen es), wenn ich wollte, etwas anderes zu tun, im catch-block - schreiben Sie zum Beispiel ein logging-Anweisung, bevor erneute auslösen.
Zusätzlich zu dem Wunsch, etwas zu tun, mit der Ausnahme auf, bevor die Anzeige - wie die Protokollierung, die andere Zeit würden Sie etwas tun, wie das ist, wenn Sie wollen, wickeln Sie es wie eine andere Ausnahme, wie:
Die Frage ist, warum Sie denken, Sie brauchen, um rethrow die Ausnahme. Habe Eclipse empfehlen umliegenden mit
try-catch
? In der Praxis werden wir selten rethrow die gleiche Ausnahme, aber sehr oft fangen und werfen anderen, die wraps der erste, vor allem, wenn der wrapper-Ausnahme nicht aktiviert ist. Dies passiert immer dann, wenn Sie fordert, die Deklaration überprüft Ausnahmen, aber die Methode, die Sie schreiben diese Aufrufe in nicht erkläre die Ausnahmen:Den Ablauf bei der Ausführung wird sofort beendet, nachdem die
throw
- Anweisung alle nachfolgenden Anweisungen werden nicht ausgeführt. Der nächste umschließttry
block geprüft, um zu sehen, ob es eincatch
Aussage, dass Spiele der Art von Ausnahme.Wenn es nicht eine übereinstimmung gefunden, wird die Steuerung an die Anweisung. Wenn nicht, dann die nächsten umschließenden
try
- Anweisung wird geprüft und so weiter. Wenn kein passendercatch
gefunden wird, dann wird die default-exception-handler hält das Programm an und zeigt den stack-trace.Wenn die Methode ist in der Lage verursacht eine Ausnahme, die nicht verarbeitet werden, muss er angeben, dieses Verhalten so, dass der Aufrufer der Methode kann der guard sich gegen diese Ausnahme.
Kann man dies tun, indem Sie eine
throws
- Klausel der Methode der Erklärung. Einthrows
- Klausel listet die Typen der Ausnahmen, die eine Methode auslösen könnte. Dies ist notwendig für alle Ausnahmen, mit Ausnahme derjenigen, TypError
oderRuntimeException
oder einer Ihrer Unterklassen. Alle anderen Ausnahmen, die eine Methode werfen kann, muss deklariert werden int diethrows
- Klausel. Wenn Sie nicht, eine compile-time Fehlermeldung.Beide Versionen wird die Ausgabe der gleichen stacktrace
ohne try/catch -
Ausgabe
mit try/catch/throw gleiche Ausnahme
wird die Ausgabe genau die gleiche wie vor
try/catch/throw-wrapping Ausnahme
Empfehlenswerter Ansatz ist, werfen Sie Ihre eigene Ausnahmen.
wickeln Sie die Ausnahme, die Sie gerade gefangen in es, wenn Sie wollen, um details der Ursache (möglicherweise wollte oder nicht wollte)
Können Sie deutlich sehen, die top-level-Problem (mein Prozess nicht abgeschlossen), und die Ursache, die dazu geführt (java.pdf-Datei nicht gefunden)