【发布时间】:2016-08-24 15:33:42
【问题描述】:
我有一个运行一系列任务的 Java 库。我使用以下方法注册了一个默认的未捕获异常处理程序:
Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());
UncaughtExceptionHandler 实现了UncaughtExceptionHandler 并且只在STDERR 中记录错误信息。
我的 Java 库是通过 JNI 从 C++ 代码调用的,JNI 使用 ExceptionCheck() 调用它,并在 C++ 中将错误记录为 FATAL。
问题是:
在运行时,当我的 Java 代码中发生 RuntimeException(或任何其他未捕获的异常)时,错误会在 C++ 中捕获,而不是我的 JavaUncaughtExceptionHandler 注册为线程默认未捕获异常处理程序。
- 这是例外行为吗?
-
DefaultUncaughtExceptionHandler何时会真正被调用?我知道在线程关闭之前,但特别是在 JNI 情况下。是在返回 C++ 之前调用还是在 C++ 代码完成之后调用)。我认为它与JNI中的线程管理有关,请分享任何相关信息。 - 无论如何我可以在我的 Java 代码中捕获所有异常(除了放置
try/catch块之外的其他替代方法)
非常感谢。
【问题讨论】:
标签: java c++ multithreading java-native-interface uncaughtexceptionhandler