如何在Java中捕获崩溃日志

时间:2020-03-05 18:53:06  来源:igfitidea点击:

我正在使用Java的跨平台应用程序进行开发,该应用程序目前在Windows,Linux和MacOS X上都可以很好地工作。我正在尝试找出一种检测(和处理)"崩溃"的好方法。是否有一种简单的跨平台方法来检测Java中的"崩溃"并做出响应?

我猜"崩溃"是指未捕获的异常。但是该代码确实使用了一些JNI,因此能够捕捉到错误的JNI代码导致的崩溃会很好,但是我有一种特定于JVM的感觉。

解决方案

回答

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

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

回答

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

回答

为了简单地处理所有问题,可以在Thread中使用以下静态方法。从Javadoc:

static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 
          Set the default handler invoked when a thread abruptly terminates due to an uncaught exception, and no other handler has been defined for that thread.

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

旁注:如果代码可以捕获,记录和/或者从更接近问题根源的异常中恢复,则更好。我会为完全不可恢复的情况(即java.lang.Error的子类)保留这种通用的崩溃处理。尝试避免RuntimeException永远不会被完全捕获的可能性,因为该软件可能会生存下来并且是更好的选择。