Wann java.lang.Error zu fangen?
In welchen Situationen sollte ein catch - java.lang.Error
auf eine Anwendung?
InformationsquelleAutor der Frage João | 2008-12-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
In welchen Situationen sollte ein catch - java.lang.Error
auf eine Anwendung?
InformationsquelleAutor der Frage João | 2008-12-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Generell nie.
Aber manchmal müssen Sie bestimmte Fehler abfangen.
Wenn Sie schreiben framework-ish-code (laden von 3rd-party-Klassen), könnte es klug sein zu fangen LinkageErrors (no class def found unbefriedigt, link, unvereinbar Klasse wechseln).
Ich habe auch gesehen, wie einige dämliche 3rd-party-code werfen sublcasses von Fehler, so müssen Sie behandeln diese entweder.
Übrigens, ich bin nicht sicher, es ist nicht möglich, sich zu erholen von OutOfMemory.
InformationsquelleAutor der Antwort Yoni Roit
Nie. Sie können nie sicher sein, dass die Anwendung ist in der Lage, um die nächste Zeile ausführen von code. Wenn Sie eine
OutOfMemoryError
Sie haben keine Garantie, dass Sie in der Lage sein, etwas zu tun zuverlässig. Fangen RuntimeException und überprüft Ausnahmen, aber niemals Fehler.http://pmd.sourceforge.net/rules/strictexception.html
InformationsquelleAutor der Antwort tronda
Grundsätzlich sollte man immer fangen
java.lang.Error
und Schreibe Sie auf ein Protokoll oder eine Anzeige an den Benutzer. Ich arbeite im support und die täglich sehen, dass die Programmierer nicht sagen kann, was passiert in einem Programm.Wenn Sie einen daemon-thread, dann müssen Sie verhindern, dass es beendet wird. In anderen Fällen Ihre Anwendung ordnungsgemäß funktioniert.
Sollten Sie nur fangen
java.lang.Error
auf höchstem Niveau.Wenn man sich die Liste der Fehler, die Sie sehen, die meisten können behandelt werden. Zum Beispiel ein
ZipError
tritt auf das Lesen von beschädigten zip-Dateien.Die häufigsten Fehler sind
OutOfMemoryError
undNoClassDefFoundError
die beide in den meisten Fällen runtime-Probleme.Beispiel:
kann produzieren ein
OutOfMemoryError
aber es ist ein Laufzeit-problem und kein Grund, zu beenden Ihr Programm.NoClassDefFoundError
treten meistens, wenn eine Bibliothek nicht vorhanden ist oder wenn Sie Arbeit mit einem anderen Java-version. Wenn es sich um einen optionalen Teil des Programms, dann sollten Sie nicht beenden Ihr Programm.Kann ich Ihnen viele weitere Beispiele, warum es ist eine gute Idee, Sie zu fangen
Throwable
auf der obersten Ebene und erzeugen eine hilfreiche Fehlermeldung.InformationsquelleAutor der Antwort Horcrux7
In Multithread-Umgebung, die Sie am meisten wollen oft, Sie zu fangen! Wenn Sie es fangen, melden Sie es, und beenden der gesamten Anwendung! Wenn Sie das nicht tun, einige Threads, vielleicht werden dabei einige entscheidende Teil wäre tot, und der rest der Anwendung wird denken, dass alles normal ist. Aus, dass viele unerwünschte Situationen passieren kann.
Eine kleinste problem ist, dass du nicht in der Lage, leicht zu finden, die Wurzel des Problems, wenn andere threads starten, werfen einige Ausnahmen, weil ein thread nicht funktionieren.
Zum Beispiel, in der Regel Schleife sollte:
Sogar in einigen Fällen, würden Sie wollen, um andere Fehler zu behandeln anders, zum Beispiel, auf OutOfMemoryError Sie wäre in der Lage, schließen Sie die Anwendung regelmäßig (vielleicht sogar freien Speicher, und weiter), auf einige andere, es gibt nicht viel Sie tun können.
InformationsquelleAutor der Antwort Sarmun
Sehr selten.
Ich würde sagen, nur auf der obersten Ebene ein thread um zu VERSUCHEN, die Ausgabe einer Meldung mit dem Grund für den thread sterben.
Wenn Sie in einem Rahmen, der nicht diese Art der Sache für Sie ist, lassen Sie es auf den Rahmen.
InformationsquelleAutor der Antwort Darron
Fast nie. Fehler sind entworfen, um die Probleme, die Anwendungen in der Regel nichts tun zu können. Die einzige Ausnahme könnte sein, zu behandeln die Darstellung der Fehler aber selbst das könnte nicht gehen, wie geplant, je nach Fehler.
InformationsquelleAutor der Antwort nicerobot
Eine
Error
normalerweise nicht erwischt zu werdenwie es zeigt einen anormalen Zustand sollte nie auftreten.Aus der Java-API-Spezifikation für die
Error
Klasse:Als die Spezifikation erwähnt, eine
Error
wird nur ausgelöst, in Umständen, dieChancen sind, wenn ein
Error
tritt auf, es gibt sehr wenig kann die Anwendung, und in einigen Fällen, die Java-Virtuelle-Maschine selbst kann in einem instabilen Zustand (wieVirtualMachineError
)Obwohl ein
Error
ist eine Unterklasse vonThrowable
was bedeutet, dass es abgefangen werden kann durch einetry-catch
- Klausel, aber es ist wahrscheinlich nicht wirklich nötig, denn die Anwendung wird in einem anormalen Zustand ist, wenn einError
ist, ausgelöst durch die JVM.Gibt es auch einen kurzen Abschnitt zu diesem Thema in Abschnitt 11.5 Die Exception-Hierarchie der Java Language Specification, 2. Auflage.
InformationsquelleAutor der Antwort coobird
Wenn Sie sind verrückt genug, um erstellen Sie eine neue unit-test-framework, Ihre test-runner werden wahrscheinlich brauchen, um java.lang.AssertionError geworfen, indem alle Testfälle.
Ansonsten, siehe andere Antworten.
InformationsquelleAutor der Antwort noahlz
Und es gibt ein paar andere Fälle, wo, wenn Sie fangen einen Fehler, Sie müssen rethrow es. Zum Beispiel ThreadDeath sollte nie erwischt werden, kann es zu großen problem ist, Sie fangen es in einer abgeschlossenen Umgebung (zB. ein application-server) :
InformationsquelleAutor der Antwort Guillaume
Sehr, sehr selten.
Habe ich es nur für eine sehr, sehr spezifische Fälle bekannt.
Zum Beispiel java.lang.UnsatisfiedLinkError geworfen werden könnte, wenn zwei Unabhängigkeit ClassLoader laden derselben DLL. (Ich bin damit einverstanden, dass ich bewegen Sie das GLAS zu einem shared-classloader)
Aber häufigste Fall ist, dass man die Protokollierung, um zu wissen, was passiert, wenn user kommen, sich zu beschweren. Sie wollen eine Meldung oder ein popup-Nutzer haben, sondern dann schweigend tot.
Sogar Programmierer, die in C/C++, Sie pop eine Fehler und sagen Sie etwas, das Menschen nicht verstehen, bevor Sie es beenden (z.B. Speicherfehler).
InformationsquelleAutor der Antwort Dennis C
In einem Android-Anwendung, die ich bin, fangen ein java.lang.VerifyError. Eine Bibliothek, die ich benutze, funktioniert nicht in Geräten mit einer alten version des OS und der code der Bibliothek werfen solche Fehler. Ich könnte natürlich den Fehler vermeiden, durch die überprüfung der version des OS zur Laufzeit, aber:
InformationsquelleAutor der Antwort kgiannakakis
ist es ganz praktisch, zu fangen, java.lang.AssertionError in einer test-Umgebung...
InformationsquelleAutor der Antwort Jono
Idealerweise sollten wir nicht behandeln/abfangen von Fehlern. Aber es kann Fälle geben, in denen wir tun müssen, basierend auf Anforderung der Rahmen-oder Anwendung. Sagen, ich habe einen XML-Parser-daemon implementiert die DOM-Parser das verbraucht mehr Speicher. Wenn die Anforderung besteht, wie der Parser-thread sollte nicht verstorben sein, wenn es bekommt OutOfMemoryErrorstattdessen sollte Sie damit umgehen und senden eine Nachricht/mail an den administrator, application/framework.
InformationsquelleAutor der Antwort user3510364
idealerweise sollten wir nie fangen Fehler in unserer Java-Anwendung, da Sie einen anormalen Zustand. Die Anwendung wäre in anormalen Zustand und könnte dazu führen, carshing oder geben etwas ernsthaft falsch Ergebnis.
InformationsquelleAutor der Antwort Vivek
Könnte es angebracht sein zu fangen Fehler in unit-tests, die überprüfen, eine Behauptung gemacht wird. Wenn jemand deaktiviert Behauptungen oder sonst löscht der Behauptung, Sie würden wissen wollen,
InformationsquelleAutor der Antwort Chanoch
Es ist ein Fehler, wenn die JVM ist nicht mehr wie erwartet funktioniert, oder am Rande. Wenn Sie fangen einen Fehler, es gibt keine Garantie, dass der catch-block ausgeführt wird, und noch weniger, dass es bis zum Ende.
Es wird auch von der ausgeführten computer, den aktuellen memory-Status, so gibt es keine Möglichkeit zu testen, versuchen Sie, und tun Sie Ihr bestes. Sie haben nur eine hasardous Ergebnis.
Werden Sie auch downgrade die Lesbarkeit des Codes.
InformationsquelleAutor der Antwort Nicolas Zozol