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
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
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.
Wahrscheinlich wäre am besten, ein wenig zu erklären der Hierarchie hier. – Xonatron
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
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
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.
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" –
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? –
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.
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.
Duplizieren: http://stackoverflow.com/questions/581878/why-catch-exceptions-in-java-when-you-can-catch-throwables –
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 –