java: Ausnahme kann nicht erneut ausgelöst werden: Nicht behandelter Ausnahmetyp Ausnahme

7

Ich möchte eine Ausnahme abfangen, sie protokollieren, ein Flag setzen und die gleiche Ausnahme erneut auslösen

Ich habe diesen Code:

%Vor%

Aber Eclipse beschwert sich bei "thr ex" und sagt "Unhandled exception type Exception" und schlägt mir vor, einen try-catch-Block darum zu legen.

Tatsächlich möchte ich, dass der Prozess diese Methode aufruft, um die Exception zu behandeln und nicht selbst. Ich möchte nur true zurückgeben, wenn alles in Ordnung ist, und es protokollieren, wenn es eine Ausnahme gibt

Auf der anderen Seite kann ich die Ausnahme in eine andere Ausnahme einfügen, aber ich kann die gleiche nicht werfen.

irgendeine Idee?

    
opensas 29.02.2012, 05:57
quelle

9 Antworten

2

Ich denke, es gibt verschiedene Dinge zu erwähnen:

  1. Sie möchten entweder doJobWithResult() bei Erfolg true zurückgeben und bei einem Fehler false, oder bei Erfolg nichts zurückgeben und bei einem Fehler eine Ausnahme auslösen. Beides ist zur selben Zeit nicht möglich. Im ersten Fall fangen Sie die Exception ab, melden Sie sie an und geben Sie false zurück, im zweiten Fall ändern Sie Ihre Signatur, um void zurückzugeben, und werfen Sie eine Ausnahme und behandeln Sie sie im Aufrufer.
  2. Es ist ein Nicht , um eine Ausnahme abzufangen, sie zu protokollieren und erneut zu starten. Warum? Weil ein potenzieller Aufrufer Ihrer Methode nicht weiß, dass Sie ihn bereits protokollieren, und moggen Sie ihn auch. Entweder eine Ausnahme auslösen (in diesem Fall muss der Anrufer damit umgehen) oder sie abfangen und behandeln (anmelden).
  3. Beachten Sie, dass das Aufrufen von Exception dem Aufrufer Ihrer Methode keinen Hinweis darauf gibt, was möglicherweise in Ihrer Methode schief gehen könnte. Es ist immer besser, spezifischere Ausnahmen auszulösen oder eine Ausnahme in eine benutzerdefinierte einzufügen wiederhole es.
  4. Wenn Sie Exception übergeben, ist ein Aufrufer möglicherweise versucht, Exception abzufangen, ohne zu bemerken, dass dadurch auch jede RuntimeException abgefangen wird (da sie von Exception abgeleitet ist), was möglicherweise nicht erwünscht ist.
quaylar 29.02.2012, 07:42
quelle
7

Ihre doJobWithResult-Methode muss deklarieren, dass sie Exception auslösen kann:

%Vor%

wird

%Vor%     
Paul Jowett 29.02.2012 06:01
quelle
4

Sie können dieselbe Ausnahme auslösen, wenn Sie throws Exception zu Ihrer Methodensignatur hinzufügen. Andernfalls können Sie eine RuntimeException auslösen.

%Vor%

In einem solchen Fall müssen Sie nicht angeben, dass public Boolean doJobWithResult() etwas auslöst, aber stellen Sie sicher, dass Sie es später richtig behandeln (fangen Sie an oder erwarten Sie, dass Ihr Thread aufhört ... es ist eine RuntimeException).

    
Jerome 29.02.2012 06:05
quelle
3

Wenn doJobWithResult nicht mit der Ausnahme umgehen muss, entfernen Sie den catch-Block und fügen Sie der Methodensignatur "throws Exception" hinzu. Die Ausnahmeprotokollierung kann in der Klasse / Methode erfolgen, die in einem entsprechenden try / catch-Block mit der Exception umgehen muss.

    
Carlos Gavidia 29.02.2012 06:04
quelle
2

Da Exception überprüft ist, ist es eine Alternative, die Exception zu erfassen Deklarieren Sie Ihre Methode so, dass sie es auslöst:

%Vor%     
dasblinkenlight 29.02.2012 05:59
quelle
2

Es ist nicht notwendig, das Ergebnis im catch-Block als false festzulegen, da der Wert nicht zurückgegeben wird (da wir eine Ausnahme auslösen).

Ihre Methode sollte auch deklarieren, dass sie eine Ausnahme auslöst, und der Client wird gezwungen sein, damit umzugehen.

Überlegen Sie auch, eine spezifischere Ausnahme zu verwenden, die in diesem speziellen Fall ausgelöst wird.

    
Mehul Lalan 29.02.2012 06:04
quelle
1

Fügen Sie throws Exception zu Ihrer Methode hinzu. Sie müssen auch result = false; in Ihrem catch -Block nicht hinzufügen.

    
Kuldeep Jain 29.02.2012 06:09
quelle
1

Ich denke, dass die Art und Weise, wie Sie mit dieser Ausnahme umgehen, wirklich angemessen ist, wenn ein Fehler der feed.fetchContents () -Methode nicht wiederhergestellt werden kann. (Idee ist besser aufzuhören als weiterzumachen) Abgesehen davon würde ich vorschlagen, dass Sie eine spezifischere Ausnahmehierarchie verwenden.

Und eine andere Sache, die ich von effektivem Java-Buch bekommen habe, ist, wenn Sie solch eine Methode schreiben, müssen Sie mit @throw (in den Kommentaren) mit dem Grund dokumentieren.

    
Eshan Sudharaka 29.02.2012 06:16
quelle
0

Sie könnten eine unkontrollierte Ausnahme auslösen

%Vor%     
Oliver Michels 29.02.2012 06:08
quelle