2017-04-17 20 views
5

Ich bin sehr unsicher über diese beiden Themen. Ich weiß, dass ich multi-catch für Ausnahmen verwenden sollte, die den gleichen Weg behandeln müssen. Aber zu welchem ​​Zweck brauche ich so etwas wirklich?Wann Multi-Catch zu verwenden und wann erneut zu starten?

private void something(String name) throws IOException, RemoteException { 
    try { 
     ... 
    } catch (Exception ex) { 

     ... // do something 

     throw ex; 
    } 
} 
+1

Die Verwendung einer generischen Ausnahme ist jedoch eine schlechte Übung. Siehe [hier] (http://stackoverflow.com/questions/2416316/why-is-the-catchexception-almost-always-a-bad-idea). – Enzokie

+0

Ist diese Frage nicht sowohl unklar als auch auf der Grundlage von Meinungen? –

Antwort

3

Sie können es tun, wenn Sie für diese Methode berücksichtigen, dass jede Ausnahme während der Ausführung geworfen sollten in der gleichen Weise behandelt werden und Sie eine Aufgabe durchführen, bevor die Ausnahme an den Client

lassen propagieren Angenommen, Sie möchten eine bestimmte Verarbeitung ausführen, wenn die Ausnahme auftritt, z. B. die Informationen protokollieren. So fangen Sie es, um diese Aufgabe zu erledigen.
Nichtsdestoweniger betrachten Sie, dass die gefangene Ausnahme ein Problem ist und dass das Protokollieren keine "echte" Behandlung der Ausnahme war. Also, lassen Sie es propagieren, indem Sie es neu streichen.

+0

Ok, danke. Aber darf ich noch eine Frage stellen? Nehmen wir an, eine NullPointerException wird ausgelöst und durch den Catch gefangen. Wird diese Exception auch an die aufrufende Methode übergeben, weil in der throws-Klausel nur IO- und RemoteException erwähnt werden? Grüße aus Deutschland – LaBlum

+0

Gern geschehen. Sehr interessante Frage. 'NullPointerException' ist eine' RuntimeException'. Diese Art von Ausnahme muss nicht explizit in der Methodendeklaration deklariert werden. Sie können es werfen, ohne es zu fangen oder die Methode als werfen zu deklarieren. Im Gegensatz zu "IOException" und "RemoteException", bei denen es sich um geprüfte Ausnahmen handelt. Diese letzteren stammen nur von 'Exception' und nicht von' RuntimeException'. – davidxxx

+0

Das stimmt ... ich habe das nicht berücksichtigt. Und was passiert, wenn eine IllegalArgumentException ausgelöst wird, zum Beispiel weil ich einen String in einer int-Variablen speichern wollte? Wird es trotzdem auf die Aufrufmethode geworfen, obwohl es in der throws-Klausel nicht erwähnt wird? – LaBlum

3

Rethrow

Wann immer Sie wollen Anrufer Methode über Ausnahme benachrichtigen, fangen Sie und rethrow Ausnahme.

Sagen Sie eine Methode CallSomething() ruft Ihre Methode etwas(). Wenn irgendeine Ausnahme innerhalb von something() auftritt, wird nur eine Ausnahme abgefangen, so dass die Anwendung nicht fehlschlägt, und sie erneut an die Methode callSomething() übergeben. Dann benennt callSomething() den Client über einen internen Fehler.

Ein anderes Beispiel ist, in MVC-Muster, Anfrage vom Client gesendet wird von einer Methode vom Controller basierend auf Anfrage Zuordnung serviert. Der Controller ruft den Dienst an und der Dienst wird mit einer Dao-Methode interagieren. Wenn in DAO eine Ausnahmebedingung auftritt, wird DAO die Ausnahme für den Dienst erneut auslösen, der Dienst wird erneut zum Controller geleitet, und der Controller benachrichtigt den Client über eine Fehlermeldung. Dies ist bekannt als Ausnahme Ausbreitung in Java. Eine Ausnahme wird von Methode zu Methode weitergegeben, bis der Call-Stack aufgefangen wird, bis sie abgefangen wird.

Multi fangen

Wenn Sie gleiche Aktion für mehrere Arten von Ausnahmen durchführen möchten, dann verwenden Sie Multi fangen.

2

Sie werden rethrow in folgenden Situationen benötigen

  1. Sie wollen Vorprozess etwas vor die Ausnahme lassen die Methode im Stich gelassen. Wenn Sie sich jedoch nicht für den Typ der Ausnahme interessieren, kann die Vorverarbeitung auch im Block finally durchgeführt werden.
  2. Sie versuchen, die geprüften Ausnahmen in eine nicht ausgewählte Ausnahme zu konvertieren. In diesem Fall werden Sie alle Ausnahmen als catch(Exception ex) abfangen und sie als throw new RuntimeException(ex) erneut auslösen.
  3. Sie möchten, dass Ihre benutzerdefinierte Ausnahme anstelle von integrierten ausgelöst wird. So fangen Sie alle Ausnahmen ab und erstellen dann Ihr eigenes Ausnahmeobjekt, vorzugsweise deaktiviert es und werfen es. Viele APIs tun dies, z. B. Spring konvertiert die untauglichen JDBC Ausnahmen von benutzerdefinierten Spring-Ausnahmen.
  4. Dieser ist eine Art Vorverarbeitung. Sie möchten alle Ausnahmen im Auge behalten, die durch das Erstellen einer ArrayList oder ähnlichem ausgelöst werden, sodass Sie am Ende eines Programms mit mehreren Schritten wissen, welche Schritte Ausnahmen auslösen. Ich habe gesehen, dass dieser in Talend generierten Java-Code verwendet wird.