2008-09-14 3 views
2

Ich arbeite an einer Cross-Plattform-Anwendung in Java, die derzeit gut auf Windows, Linux und MacOS X funktioniert. Ich versuche, eine gute Methode zur Erkennung (und Handhabung) auszuarbeiten von 'stürzt ab'. Gibt es eine einfache, plattformübergreifende Möglichkeit, "Abstürze" in Java zu erkennen und als Reaktion etwas zu tun?Wie zeichne ich Absturzprotokolle in Java auf?

Ich denke, durch "Abstürze" meine ich nicht abgefangene Ausnahmen. Allerdings verwendet der Code einige JNI, so dass es schön wäre, Abstürze von schlechtem JNI-Code zu bemerken, aber ich habe das Gefühl, dass das JVM-spezifisch ist.

Antwort

4

Für eine einfache Sammelhandhabung können Sie die folgende statische Methode in Thread verwenden. Von der Javadoc:

static void setDefaultUncaughtExceptionHandler (Thread.UncaughtExceptionHandler eh)
                    Set aufgerufen der Standard-Handler, wenn ein Thread aufgrund einer abgefangene Ausnahme beendet abrupt, und kein anderer Handler wurde für diesen Thread definiert.

Dies ist ein sehr breiter Weg, um mit Fehlern oder ungeprüften Ausnahmen umzugehen, die sonst nirgends gefunden werden können.

Randbemerkung: Es ist besser, wenn der Code von Ausnahmen, die näher an der Quelle des Problems liegen, abfangen, protokollieren und/oder wiederherstellen kann. Ich würde diese Art der generellen Crash-Behandlung für vollständig nicht wiederherstellbare Situationen reservieren (d. H. Subklassen von java.lang.Error). Versuchen Sie, die Möglichkeit zu vermeiden, dass eine RuntimeException jemals völlig unerfasst wird, da es möglich und vorzuziehen ist, dass die Software das überlebt.

3

Für die Behandlung nicht abgefangener Ausnahmen können Sie eine neue ThreadGroup bereitstellen, die eine Implementierung von ThreadGroup.uncaughtException (...) bereitstellt. Sie können dann alle nicht abgefangenen Ausnahmen abfangen und entsprechend behandeln (z. B. ein Absturzprotokoll nach Hause senden).

Ich kann Ihnen auf der JNI-Front nicht helfen, es gibt wahrscheinlich eine Möglichkeit, eine native Wrapper-Programmdatei vor dem Aufruf der JVM zu verwenden, aber diese ausführbare Datei muss über alle möglichen JVMs wissen, die sie aufrufen könnte und wie Abstürze anzeigen und Absturzprotokolle usw.

1

Nicht sicher, ob dies erforderlich ist, aber Sie können auch feststellen, ob innerhalb Ihres systemeigenen Codes eine Ausnahme aufgetreten ist. Weitere Informationen finden Sie unter http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234.

+0

Das ist nützlich zu wissen, wie ich Java-Code von nativem Code aufrufen, so wird es zu den Punkten hinzufügen, wo ich mit unerwarteten Ausnahmen/Abstürzen umgehen kann. Es sieht so aus, als würde ich den Code mit ein paar Überprüfungen für Abstürze mit Code wie diesem streuen müssen. –