Java UncaughtExceptionHandler 使用 JNI 没有得到任何异常
Java UncaughtExceptionHandler haven't got any exception using JNI
我有一个 Java 库,其中 运行 一系列任务。我使用以下方法注册了一个默认的未捕获异常处理程序:
Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());
UncaughtExceptionHandler实现UncaughtExceptionHandler
,只记录STDERR
中的错误信息。
我的 Java 库是通过 JNI 从 C++ 代码调用的,JNI 使用 ExceptionCheck()
调用它并在 C++ 中将错误记录为 FATAL。
问题是:
在 运行 时间里,当我的 Java 代码中出现 RuntimeException
(或任何其他未捕获的异常)时,错误是在 C++ 中捕获的,而不是我的 JavaUncaughtExceptionHandler
注册为线程默认的未捕获异常处理程序。
- 这是例外行为吗?
DefaultUncaughtExceptionHandler
什么时候真正被调用?我知道在线程关闭之前,但特别是在 JNI 情况下。是在 return 之前调用 C++ 还是在 C++ 代码完成之后调用)。我认为这与JNI中的线程管理有关,请分享任何相关信息。
- 我是否可以在我的 Java 代码中捕获所有异常(除了放置
try
/catch
块之外的其他替代方法)
非常感谢。
听起来你在谈论 Java 调用 API(即,你在 C++ 中调用 Java 方法程序,而不是简单的 JNI,其中调用以另一种方式进行。)
我不是专家,但我使用过 Java 调用 API。
据我所知,只有在 Java 线程的 run()
方法抛出异常时才会调用未捕获的异常处理程序。但是在由 C/C++ 代码创建的线程中 没有 任何 run()
方法。
我写的是 C,而不是 C++,所以我对 Java 的调用看起来都像
jobject return_value = (*env)->CallObjectMethod(env, instance, method_id, ...);
当从 C 调用时,它总是 returns,但在您使用 return_value
之前,您必须检查该方法是否正常返回或抛出异常。
如果它抛出异常,那么异常就不可能是"uncaught",如果C代码没有调用(*env)->ExceptionClear(env)
(即如果C代码没有"catch"例外),那我不记得发生了什么,但我认为这不是很好。
我有一个 Java 库,其中 运行 一系列任务。我使用以下方法注册了一个默认的未捕获异常处理程序:
Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());
UncaughtExceptionHandler实现UncaughtExceptionHandler
,只记录STDERR
中的错误信息。
我的 Java 库是通过 JNI 从 C++ 代码调用的,JNI 使用 ExceptionCheck()
调用它并在 C++ 中将错误记录为 FATAL。
问题是:
在 运行 时间里,当我的 Java 代码中出现 RuntimeException
(或任何其他未捕获的异常)时,错误是在 C++ 中捕获的,而不是我的 JavaUncaughtExceptionHandler
注册为线程默认的未捕获异常处理程序。
- 这是例外行为吗?
DefaultUncaughtExceptionHandler
什么时候真正被调用?我知道在线程关闭之前,但特别是在 JNI 情况下。是在 return 之前调用 C++ 还是在 C++ 代码完成之后调用)。我认为这与JNI中的线程管理有关,请分享任何相关信息。- 我是否可以在我的 Java 代码中捕获所有异常(除了放置
try
/catch
块之外的其他替代方法)
非常感谢。
听起来你在谈论 Java 调用 API(即,你在 C++ 中调用 Java 方法程序,而不是简单的 JNI,其中调用以另一种方式进行。)
我不是专家,但我使用过 Java 调用 API。
据我所知,只有在 Java 线程的 run()
方法抛出异常时才会调用未捕获的异常处理程序。但是在由 C/C++ 代码创建的线程中 没有 任何 run()
方法。
我写的是 C,而不是 C++,所以我对 Java 的调用看起来都像
jobject return_value = (*env)->CallObjectMethod(env, instance, method_id, ...);
当从 C 调用时,它总是 returns,但在您使用 return_value
之前,您必须检查该方法是否正常返回或抛出异常。
如果它抛出异常,那么异常就不可能是"uncaught",如果C代码没有调用(*env)->ExceptionClear(env)
(即如果C代码没有"catch"例外),那我不记得发生了什么,但我认为这不是很好。