2008-09-14 43 views
2

我正在研究Java中的跨平台应用程序,该程序目前可以在Windows,Linux和MacOS X上很好地工作。我正在尝试制定一种很好的方法来执行检测(和处理) '崩溃'。有没有一种简单的,跨平台的方式来检测Java中的“崩溃”并做出响应?如何在Java中捕获崩溃日志

我想通过'崩溃'我的意思是未捕获的异常。然而,代码确实使用了一些JNI,所以能够从错误的JNI代码中捕获崩溃会很好,但我有一种JVM特有的感觉。

回答

4

对于简单的全部处理,您可以在Thread中使用以下静态方法。根据JavaDoc:

静态无效setDefaultUncaughtExceptionHandlerThread.UncaughtExceptionHandler EH)
                   设置的默认处理时调用线程突然终止,由于未捕获到异常,并没有其他的处理程序已经为该线程定义。

这是一个非常广泛的方式来处理错误或未经检查的异常,可能不会在其他地方发现。

附注:如果代码能够从更接近问题源的异常中捕获,记录和/或恢复,则更好。我会为完全不可恢复的情况保留这种广义的碰撞处理(即java.lang.Error的子类)。尽量避免RuntimeException可能完全没有被捕获,因为它可能是 - 可取的 - 为了软件能够存活下来。

3

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

我无法帮助你在JNI方面,在调用JVM之前可能有一种使用本机封装可执行文件的方式,但该可执行文件需要知道它可能调用的所有可能的JVM,以及指示崩溃以及崩溃日志的位置等。

1

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

+0

这很有用,因为我确实从本机代码调用Java代码,所以它会添加到我可以处理意外异常/崩溃的点。 它看起来像我将不得不使用这样的代码使用一些检查崩溃的代码来分散代码。 – 2008-09-14 23:21:21