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.
Am besten erklären Sie hier ein wenig die Hierarchie.
Xonatron
11
Kontext für diese Antwort: Throwable enthält sowohl Fehler als auch Ausnahme als Unterklassen, sodass der erste Versuch / Fang den zweiten einschließt, aber normalerweise zu weit gefasst ist.
Noel
2
Es enthält auch benutzerdefinierte direkte Unterklassen von Throwable und Instanzen von Throwable selbst. Nichts hindert Sie daran zu schreiben throw new Throwable();, also ist es der einzige Weg, wirklich alles zu fangen.
Antimon
3
Obwohl dies akzeptiert wird, wird die Frage nicht beantwortet, da der Großteil der Antwort eine bewährte Methode zum Abfangen von Exception und Throwable beschreibt und die Frage den Unterschied betraf (wie zum Zeitpunkt der Verwendung, wenn ich dies auch möchte). "Es enthält Dinge, die Fehler der Unterklasse enthalten" ist der einzige angegebene Unterschied und es ist wirklich eine umfassende Antwort: Was ist Fehler? Warum ist es wichtig, dass es es enthält? Irgendwelche anderen Unterschiede oder Best Practices?
Oded Niv
@OdedNiv "Was ist ein Fehler? Warum ist es wichtig, dass er enthalten ist?" Sie können diese in einer anderen Frage stellen.
Kronen
182
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.
Erstaunlicherweise melden die meisten "Code-Analyse" -Tools 4 Jahre nach dieser Antwort immer noch das Fangen als kritischen Fehler. Die Protokollierung ist ein sehr wichtiger Grund, um Throwable zu fangen. Die jahrelange Entwicklung von Servern hat mir gezeigt, dass 1) die Protokollierung trotz Erhalt einer 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
Bruno Grieder
4
Was 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?
Alexander Abakumov
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.
Nom1fan
22
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.
Antworten:
Durch das Fangen werden
Throwable
Dinge eingeschlossen, die der Unterklasse angehörenError
. 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.quelle
throw new Throwable();
, also ist es der einzige Weg, wirklich alles zu fangen.Die erste fängt alle Unterklassen von
Throwable
(dies schließtException
und einError
), die zweite fängt alle Unterklassen vonException
.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 UnterklasseRuntimeException
zeigt einen Programmierfehler an und ist normalerweise auch nicht abzufangen.quelle
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ältprogrammatically 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 veraltetenThread.stop()
Methode abzuhalten . WennThrowable
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 mitOutOfMemoryError
undInternalError
oder umzugehenStackOverflowError
.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.quelle
Throwable
ist super klasse vonException
sowieError
. Im Normalfall sollten wir immer Unterklassen von abfangenException
, 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 abfangenThrowable
.quelle
Ich habe gesehen, dass Leute Throwable verwenden, um einige Fehler zu erkennen, die aufgrund von Infra-Fehlern / Nichtverfügbarkeit auftreten können.
quelle