我正在使用 Java 开发一个跨平台应用程序,该应用程序目前在 Windows、Linux 和 MacOS X 上运行良好。我正在尝试找出一种很好的方法来检测(和处理)“崩溃”。是否有一种简单的跨平台方法来检测 Java 中的“崩溃”并采取相应措施?
我猜“崩溃”是指未捕获的异常。然而,代码确实使用了一些 JNI,因此能够从错误的 JNI 代码中捕获崩溃会很好,但我感觉这是 JVM 特定的。
我正在使用 Java 开发一个跨平台应用程序,该应用程序目前在 Windows、Linux 和 MacOS X 上运行良好。我正在尝试找出一种很好的方法来检测(和处理)“崩溃”。是否有一种简单的跨平台方法来检测 Java 中的“崩溃”并采取相应措施?
我猜“崩溃”是指未捕获的异常。然而,代码确实使用了一些 JNI,因此能够从错误的 JNI 代码中捕获崩溃会很好,但我感觉这是 JVM 特定的。
对于简单的包罗万象的处理,您可以在Thread中使用以下静态方法。来自 Javadoc:
static void setDefaultUncaughtExceptionHandler ( Thread.UncaughtExceptionHandler eh)
设置当线程由于未捕获的异常而突然终止时调用的默认处理程序,并且没有为该线程定义其他处理程序。
这是处理可能无法在其他任何地方捕获的错误或未经检查的异常的一种非常广泛的方法。
旁注:如果代码可以捕获、记录和/或从更接近问题根源的异常中恢复,那就更好了。我会为完全不可恢复的情况(即java.lang.Error的子类)保留这种通用的崩溃处理。尽量避免RuntimeException完全未被捕获的可能性,因为软件有可能——而且更可取——在这种情况下幸存下来。
为了处理未捕获的异常,您可以提供一个新的 ThreadGroup,它提供了 ThreadGroup.uncaughtException(...) 的实现。然后,您可以捕获任何未捕获的异常并适当地处理它们(例如,将崩溃日志发送回家)。
我无法在 JNI 方面为您提供帮助,可能有一种方法可以在调用 JVM 之前使用本机包装器可执行文件,但是该可执行文件需要知道它可能调用的所有可能的 JVM 以及指示崩溃的方式和位置放置崩溃日志等。
不确定这是否是您所需要的,但您也可以从本机代码中检测是否发生异常。有关更多信息,请参见http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234。