私は一連のタスクを実行するJavaライブラリを持っています。そして、私が使用してデフォルトのキャッチされない例外ハンドラを登録:Java UncaughtExceptionHandlerにJNIを使用した例外がありません
Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());
たuncaughtExceptionHandlerはUncaughtExceptionHandler
を実装し、唯一STDERR
にエラー情報を記録します。
JavaライブラリはC++コードからJNIを介して呼び出され、JNIはExceptionCheck()
で呼び出し、エラーをFATALとしてC++に記録します。
問題がある:ランタイムで
、RuntimeException
(または任意の他の捕捉されない例外)は、エラーがC++で撮影してしまった私のJavaコードで起こるがありますとき、代わりに、スレッドのデフォルトキャッチされない例外ハンドラとして登録された私のJavaUncaughtExceptionHandler
の。
- これは例外的な動作ですか?
DefaultUncaughtExceptionHandler
は実際にいつ呼び出されますか?スレッドがシャットダウンする前に知っていますが、具体的にはJNIの場合です。それはC++に戻る前に、またはC++コードが終了した後に呼び出されますか?)私はそれがJNIのスレッド管理に関係していると思うので、関連する情報も共有してください。- 私はそんなに私のJavaコードですべての例外(
try
/catch
ブロックを置く除いて、他の代替方法)
感謝をキャッチすることができますとにかくあります。
James、あなたの説明のために非常に多くの、非常に有用です。 jenv.CheckException(...)メソッドを使用してJavaメソッドを呼び出すと、例外はC++で取得されます。コードは実行するのが安全だと思いますが、CではなくJavaですべての例外をログに記録したいだけですが、UncaughtExceptionHandlerでは実現できないようです。 – user788767