it-swarm.com.de

Unterschied zwischen der Verwendung von Throwable und Exception in einem Try-Catch

Manchmal sehe ich

try {

} catch(Throwable e) {

}

Und manchmal

try {

} catch(Exception e) {

}

Was ist der Unterschied

258
jax

Indem Sie Throwable abfangen, werden Dinge eingeschlossen, die Error unterklassifizieren. Sie sollten das im Allgemeinen nicht tun, außer vielleicht auf der allerhöchsten "catch all" -Ebene eines Threads, in dem Sie absolut alles protokollieren oder anderweitig behandeln möchten, was schief gehen kann. Typischer wäre es in einer Anwendung vom Typ Framework (z. B. einem Anwendungsserver oder einem Testframework), in der unbekannter Code ausgeführt werden kann und die nicht von irgendetwas betroffen sein sollte, das mit diesem Code schief geht, z so viel wie möglich.

211
Yishai

Die erste fängt alle Unterklassen von Throwable (dies schließt Exception und Error ein ), der zweite fängt alle Unterklassen von Exception .

Error kann in keiner Weise programmgesteuert wiederhergestellt werden und darf normalerweise nicht abgefangen werden, außer zu Protokollierungszwecken (die es erneut durchlaufen). Exception kann programmgesteuert wiederhergestellt werden. Die Unterklasse RuntimeException weist auf einen Programmierfehler hin und ist normalerweise auch nicht zu fangen.

156
BalusC

Throwable ist eine Superklasse von Exception sowie Error. Im Normalfall sollten wir immer Unterklassen von Exception fangen, damit die Grundursache nicht verloren geht.

Nur in besonderen Fällen, in denen Sie die Möglichkeit sehen, dass etwas schief geht, das nicht von Ihrem Java Code gesteuert wird, sollten Sie Error oder Throwable abfangen.

Ich erinnere mich, Throwable abgefangen zu haben, um zu kennzeichnen, dass eine native Bibliothek nicht geladen ist.

19
rai.skumar

Thowable fängt wirklich alles ab, auch ThreadDeath, das standardmäßig geworfen wird, um einen Thread von der jetzt veralteten Thread.stop() -Methode abzuhalten. Wenn Sie also Throwable abfangen, können Sie sicher sein, dass Sie den try-Block niemals verlassen, ohne zumindest Ihren catch-Block zu durchlaufen, aber Sie sollten auch bereit sein, OutOfMemoryError und InternalError oder StackOverflowError.

Das Abfangen von Throwable ist am nützlichsten für äußere Serverschleifen, die alle Arten von Anforderungen an externen Code delegieren, sich jedoch möglicherweise selbst niemals beenden, um den Dienst am Leben zu erhalten.

16
x4u