Rethrow-Ausnahme in Java

7

Ich habe eine sehr einfache Frage über das erneute Auslösen einer Ausnahme in Java.

Hier ist das Code-Snippet:

%Vor%

Warum müssen wir ex in der ersten Version neu werfen, während die zweite Version eleganter aussieht? Was sind die Vorteile und welche Version wird gegenüber der anderen bevorzugt?

    
MinhHoang 15.08.2012, 15:58
quelle

7 Antworten

14

Sie haben Recht. Zweite Version ist besser. Außerdem macht die erste Version keinen Sinn. Es tut das gleiche, außer dass die Stapelverfolgung der Ausnahme "falsch" ist.

Es gibt folgende Gründe, Ausnahmen zu "werfen":

  1. Wenn Sie vorher etwas zu tun haben.
  2. Wenn Sie die Ausnahme eines Typs abfangen und eine Ausnahme anderen Typs auslösen:

Beispiel:

%Vor%     
AlexR 15.08.2012, 16:01
quelle
7

Im obigen Beispiel hat das erneute Werfen von Exception keinen Sinn.

Dies kann nützlich sein, wenn die Methode, die die Exception abfängt und dann erneut auslöst, zusätzliche Maßnahmen ergreifen muss, wenn sie Exception sieht, und wünscht außerdem, dass die Exception weitergegeben wird an den Aufrufer, damit der Aufrufer das Exception sehen und auch etwas unternehmen kann.

    
pb2q 15.08.2012 15:59
quelle
6

Ich würde nur eine Exception abfangen / erneut auslösen (anstatt sie nur zu werfen), wenn ich etwas anderes im catch-Block machen möchte - zum Beispiel, schreibe eine Logging-Anweisung, bevor ich sie erneut austrage.

    
smcg 15.08.2012 15:59
quelle
3

Zusätzlich zu dem Wunsch, etwas mit der Ausnahme vor dem Beenden zu machen - wie das Logging, das andere Mal würden Sie etwas tun, wenn Sie es als eine andere Ausnahme umschließen möchten, wie:

%Vor%     
jcern 15.08.2012 16:04
quelle
2

Die Frage ist, warum Sie denken, dass Sie die Ausnahme erneut auslösen müssen. Hat Eclipse eine Umgebung mit try-catch vorgeschlagen? In der Praxis wiederholen wir selten die gleiche Ausnahme, aber sehr oft fangen wir eine und werfen eine andere, die umschließt die erste, besonders wenn die Wrapper-Ausnahme nicht aktiviert ist. Dies geschieht immer dann, wenn Sie Aufrufe haben, die eine überprüfte Ausnahme deklarieren, aber die Methode, in die Sie diese Aufrufe schreiben, deklariert diese Ausnahmen nicht:

%Vor%     
Marko Topolnik 15.08.2012 16:08
quelle
1

Der Ablauf der Ausführung stoppt unmittelbar nach der throw -Anweisung; Alle nachfolgenden Anweisungen werden nicht ausgeführt. Der nächste umschließende try -Baustein wird überprüft, um festzustellen, ob eine catch -Anweisung vorhanden ist, die dem Typ der Ausnahme entspricht.

Wenn eine Übereinstimmung gefunden wird, wird die Kontrolle an diese Anweisung übergeben. Wenn nicht, wird die nächste einschließende try -Anweisung überprüft und so weiter. Wenn kein übereinstimmender catch gefunden wird, hält der standardmäßige Ausnahmebehandler das Programm an und druckt den Stapel-Trace.

Wenn die Methode in der Lage ist, eine Ausnahme zu verursachen, die sie nicht behandelt, muss sie dieses Verhalten angeben, damit sich Anrufer der Methode vor dieser Ausnahme schützen können.

Dazu können Sie eine throws -Klausel in die Deklaration der Methode einfügen. Eine throws -Klausel listet die Arten von Ausnahmen auf, die eine Methode auslösen könnte. Dies ist für alle Ausnahmen erforderlich, außer für solche vom Typ Error oder RuntimeException oder einer ihrer Unterklassen. Alle anderen Ausnahmen, die eine Methode auslösen kann, müssen in der throws -Klausel deklariert sein. Wenn dies nicht der Fall ist, wird ein Fehler bei der Kompilierung auftreten.

    
Pankti 05.01.2017 17:23
quelle
1

Beide Versionen geben den gleichen Stacktrace aus

ohne try / catch

%Vor%

gibt

aus %Vor%

mit try / catch / throw selbe Ausnahme

%Vor%

wird genauso ausgegeben wie vorher

%Vor%

try / catch / throw Umbruchausnahme

Es empfiehlt sich, eigene Ausnahmen zu erstellen. wrap die Ausnahme, die Sie gerade gefangen haben, wenn Sie Details der Grundursache angeben möchten (möglicherweise wollte oder wollte nicht)

%Vor%

Sie können das Problem auf oberster Ebene (mein Prozess wurde nicht abgeschlossen) und die zugrunde liegende Ursache (Datei java.pdf nicht gefunden) deutlich sehen

%Vor%     
Julien 30.03.2017 09:35
quelle