Manchmal verstehe ich
try {
} catch(Throwable e) {
}
Und manchmal
try {
} catch(Exception e) {
}
Was ist der Unterschied?
Manchmal verstehe ich
try {
} catch(Throwable e) {
}
Und manchmal
try {
} catch(Exception e) {
}
Was ist der Unterschied?
Antworten:
Durch das Fangen werden Throwable
Dinge eingeschlossen, die der Unterklasse angehören Error
. Sie sollten dies im Allgemeinen nicht tun, außer vielleicht auf der höchsten "catch all" -Ebene eines Threads, in dem Sie absolut alles protokollieren oder auf andere Weise behandeln möchten, was schief gehen kann. Dies ist eher in einer Framework-Anwendung (z. B. einem Anwendungsserver oder einem Testframework) der Fall, in der unbekannter Code ausgeführt werden kann und so weit wie möglich von nichts betroffen sein sollte , das mit diesem Code schief geht.
throw new Throwable();
, also ist es der einzige Weg, wirklich alles zu fangen.
Die erste fängt alle Unterklassen von Throwable
(dies schließt Exception
und ein Error
), die zweite fängt alle Unterklassen von Exception
.
Error
ist programmatisch in keiner Weise wiederherstellbar und darf normalerweise nicht abgefangen werden, außer zu Protokollierungszwecken (die es erneut durchlaufen). Exception
ist programmgesteuert wiederherstellbar. Seine Unterklasse RuntimeException
zeigt einen Programmierfehler an und ist normalerweise auch nicht abzufangen.
Error
und 2) Wenn keine Protokollierung erfolgt, Sie möglicherweise nie benachrichtigt werden, dass eine OOM aufgetreten ist, und Sie sich fragen, warum sich der Server "lustig" verhält
programmatically unrecoverable
bedeutet genau? Ist es so schwerwiegend, dass wir im Grunde KEINE Java-Methode mehr aufrufen können, nachdem wir sie abgefangen haben (Protokollierung usw.), ohne die Möglichkeit zu haben, ein unvorhersehbares Verhalten von JVM zu erhalten?
Its subclass RuntimeException indicates a programming error
: Ich bin mir nicht sicher, ob ich dieser Aussage zustimme. Wenn dies zutrifft, bedeutet dies, dass alle erwarteten Ausnahmen überprüft werden sollten. Was ist, wenn ich erwarte, dass etwas fehlschlägt und von meiner Anwendung nicht wiederhergestellt werden kann, ich aber zumindest eine sinnvolle Ausnahme auslösen möchte? Die Verwendung einer aktivierten Ausnahme scheint in diesem Fall nutzlos zu sein und erzeugt Boilerplate-Code.
Thowable
fängt wirklich alles ab, auch ThreadDeath, das standardmäßig ausgelöst wird, um einen Thread von der jetzt veralteten Thread.stop()
Methode abzuhalten . Wenn Throwable
Sie also fangen , können Sie sicher sein, dass Sie den try-Block niemals verlassen, ohne zumindest Ihren catch-Block zu durchlaufen, aber Sie sollten bereit sein, auch mit OutOfMemoryError
und InternalError
oder umzugehen StackOverflowError
.
Das Abfangen Throwable
ist am nützlichsten für äußere Serverschleifen, die alle Arten von Anforderungen an externen Code delegieren, aber möglicherweise selbst nie beendet werden, um den Dienst am Leben zu erhalten.
Throwable
ist super klasse von Exception
sowie Error
. Im Normalfall sollten wir immer Unterklassen von abfangen Exception
, damit die Grundursache nicht verloren geht.
Nur in besonderen Fällen, in denen Sie die Möglichkeit sehen, dass etwas schief geht, das nicht die Kontrolle über Ihren Java-Code hat, sollten Sie Error
oder abfangen Throwable
.
Ich erinnere mich, dass ich Throwable gefangen habe, um zu kennzeichnen, dass eine native Bibliothek nicht geladen ist.