HotSpot VMでは、SetUnhandledExceptionFilter
API(32ビット・システムの場合)またはAddVectoredExceptionHandler
API(64ビット・システムの場合)を使用して、初期化中に最上位の例外ハンドラをインストールします。
また、作成される各スレッドのスレッド(内部)起動関数呼出しの周囲に、C++の__try
/__except
ブロックを使用してwin32 SEHをインストールします。
最後に、JNI関数の周囲に例外ハンドラをインストールします。
アプリケーションでJNIコード内の構造化例外を処理する必要がある場合は、C++の__try
/__except
文を使用できます。ただし、JNIコード内でベクトル化例外ハンドラを使用する必要がある場合、そのハンドラはVMの例外ハンドラに進むためにEXCEPTION_CONTINUE_SEARCH
を返す必要があります。
一般に、例外が発生する状況には2つのカテゴリがあります。
例外が予想され、処理されるとき。例として、前述の(NULLへのアクセスによってEXCEPTION_ACCESS_VIOLATION
が発生し、処理される)暗黙的なNULL処理があります。
予想外の例外。例として、VMコード、JNIコード、またはネイティブ・コード内で実行されているときのEXCEPTION_ACCESS_VIOLATION
があります。これらの場合、このシグナルは予想されていないため、エラー・ログを作成してプロセスを終了するために致命的エラー処理が呼び出されます。