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