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 ThrowableDinge 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 Exceptionund ein Error), die zweite fängt alle Unterklassen von Exception.
Errorist programmatisch in keiner Weise wiederherstellbar und darf normalerweise nicht abgefangen werden, außer zu Protokollierungszwecken (die es erneut durchlaufen). Exceptionist programmgesteuert wiederherstellbar. Seine Unterklasse RuntimeExceptionzeigt einen Programmierfehler an und ist normalerweise auch nicht abzufangen.
Errorund 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 unrecoverablebedeutet 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.
Thowablefängt wirklich alles ab, auch ThreadDeath, das standardmäßig ausgelöst wird, um einen Thread von der jetzt veralteten Thread.stop()Methode abzuhalten . Wenn ThrowableSie 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 OutOfMemoryErrorund InternalErroroder umzugehen StackOverflowError.
Das Abfangen Throwableist 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.
Throwableist super klasse von Exceptionsowie 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 Erroroder abfangen Throwable.
Ich erinnere mich, dass ich Throwable gefangen habe, um zu kennzeichnen, dass eine native Bibliothek nicht geladen ist.