2010-02-16 18 views
182

Manchmal sehe ichUnterschied zwischen der Verwendung von Throwable und Ausnahme in einem Try-Catch

try { 

} catch(Throwable e) { 

} 

Und manchmal

try { 

} catch(Exception e) { 

} 

Was ist der Unterschied

+6

Duplizieren: http://stackoverflow.com/questions/581878/why-catch-exceptions-in-java-when-you-can-catch-throwables –

+2

Verwandte: http://stackoverflow.com/questions/2129647/exception-vs-throwable-in-java http://StackOverflow.com/Questions/498217/When-Should-Throwable-Be-use-instead-of-new-exception –

Antwort

158

von Throwable fangen sie enthält Dinge, die Error Unterklasse. Das solltest du normalerweise nicht machen, außer vielleicht auf der aller höchsten Ebene eines Threads, bei der du alles protokollieren oder anderweitig verarbeiten willst, was schiefgehen kann. In einer Framework-Anwendung (z. B. einem Anwendungsserver oder einem Testframework) wäre es typischer, wo unbekannter Code ausgeführt werden könnte und nicht von irgendetwas betroffen sein sollte, das mit diesem Code so weit wie möglich schief geht.

+20

Wahrscheinlich wäre am besten, ein wenig zu erklären der Hierarchie hier. – Xonatron

+5

Kontext für diese Antwort: Throwable enthält sowohl Error als auch Exception als Unterklassen, also ist der erste try/catch-Wert der zweite, aber normalerweise übermäßig breit. – Noel

+2

Es enthält auch benutzerdefinierte direkte Unterklassen von Throwable und Instanzen von Throwable selbst. Es gibt nichts, was Sie davon abhält, 'throw new Throwable();' zu schreiben, also ist es der einzige Weg, um wirklich alles einzufangen. – Antimony

116

Die erste fängt alle Subklassen von Throwable (dies schließt Exception und Error), das zweite alle Subklassen von Exception abfängt.

Error ist programmatisch in keiner Weise wiederherstellbar und wird in der Regel nicht abgefangen, außer für Protokollierungszwecke (die es erneut durchlaufen). Exception ist programmatisch wiederherstellbar. Seine Unterklasse RuntimeException weist auf einen Programmierfehler hin und ist in der Regel nicht zu erfassen.

+17

Ganz erstaunlich, 4 Jahre nach dieser Antwort, die meisten "Code-Analyse" -Tools werden immer noch als ein * kritischer * Fehler werfen werfen. Protokollierung ist ein sehr guter Grund, um Throwable zu fangen. Jahre der Entwicklung von Servern sagen mir, dass 1) Protokollierung trotz eines "Fehler" und 2) Wenn keine Protokollierung, Sie möglicherweise nie benachrichtigt werden, dass ein OOM passiert, so dass Sie sich wundern, warum der Server begann sich "lustig" –

+0

Was macht 'programmatisch nicht behebbar' bedeuten genau? Ist es so schwerwiegend, dass wir grundsätzlich keine Java-Methode aufrufen können, nachdem wir sie abgefangen haben (Logging usw.), ohne dass dadurch ein unvorhersagbares Verhalten von JVM hervorgerufen wird? –

9

Thowable fängt wirklich alles sogar ThreadDeath, die standardmäßig ausgelöst wird, um einen Thread von der jetzt veralteten Thread.stop() Methode zu stoppen. Durch das Abfangen von Throwable können Sie also sicher sein, dass Sie den try-Block niemals verlassen werden, ohne Ihren catch-Block zu durchlaufen, aber Sie sollten auch bereit sein, auch OutOfMemoryError und InternalError oder StackOverflowError zu behandeln.

Catching Throwable ist am nützlichsten für äußere Server-Schleifen, die alle Arten von Anfragen an externen Code delegieren, aber niemals selbst enden dürfen, um den Dienst am Leben zu erhalten.

10

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

Nur spezielle Fälle, in denen Sie die Möglichkeit der Dinge sehen falsch gehen, die nicht in der Kontrolle von Java-Code, sollten Sie Error oder Throwable fangen.

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