我正在开发一个 Java 跨平台应用程序,该应用程序目前在 Windows、Linux 和 MacOS X 上运行良好。我正在尝试找出一种很好的方法来检测(和处理)“崩溃”。是否有一种简单的跨平台方法来检测 Java 中的“崩溃”并采取措施进行响应?

我想我所说的“崩溃”是指未捕获的异常。然而,代码确实使用了一些 JNI,因此如果能够捕获不良 JNI 代码造成的崩溃就太好了,但我有一种感觉,这是 JVM 特有的。

有帮助吗?

解决方案

对于简单的包罗万象的处理,您可以在中使用以下静态方法 线. 。来自 Javadoc:

静态无效 setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler 呃)
设置当线程由于未捕获的异常而突然终止并且尚未为该线程定义其他处理程序时调用的默认处理程序。

这是处理可能无法在其他地方捕获的错误或未经检查的异常的非常广泛的方法。

边注: 如果代码能够捕获、记录和/或从更接近问题根源的异常中恢复,那就更好了。我会为完全无法恢复的情况保留这种通用的崩溃处理(即的子类 java.lang.Error)。尽量避免出现以下情况的可能性 运行时异常 永远不会完全未被捕获,因为软件有可能并且更可取地幸存下来。

其他提示

为了处理未捕获的异常,您可以提供一个新的 ThreadGroup,它提供 ThreadGroup.uncaughtException(...) 的实现。然后,您可以捕获任何未捕获的异常并适当处理它们(例如将崩溃日志发送回家)。

我无法在 JNI 方面为您提供帮助,可能有一种方法在调用 JVM 之前使用本机包装器可执行文件,但是该可执行文件需要了解它可能调用的所有可能的 JVM 以及指示如何崩溃以及在何处崩溃崩溃日志被放置等。

不确定这是否是您所需要的,但您还可以检测本机代码中是否发生异常。看 http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234 了解更多信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top