Exception
ここでは、との違いに関する一般的な質問を数多く見てきましたThrowable
。私は違いを知っており、より具体的な質問があります。
私は、ユーザーが提供するいくつかのコードをバインドして一緒に実行するライブラリを作成しています。ピースの 1 つが失敗すると、計算全体が破棄されます。リソースの使用をクリーンに保つために、ユーザーは、そのようなイベントが発生したときに実行されるファイナライザーを提供することもできます。パターンは次のようなものです。
try {
// process ...
} catch (Exception ex) {
runRegisteredFinalizers();
throw ex;
}
私の質問は次のとおりです。上記のように sをインターセプトして再スローする必要がありますかException
、それとも s もインターセプトする必要がありThrowable
ますか? 発生した場合Error
、その可能性はありますか
- JVM は回復しますか? (では、ファイナライザーを実行する意味はありますか?)
- JVM は、実際に実行できる状態になりますか?
また、ファイナライザーを実行するときは、例外をキャッチして無視するので、登録されている他のファイナライザーが実行される可能性があります。たとえば、次のようになります。
try {
finalizer.run();
}
catch (Exception ex) {
log.error("Exception in a finalizer", ex);
}
繰り返しますが、s だけをインターセプトする必要がありますか?Exception
またはThrowable
s もインターセプトする必要がありますか? sを無視して再スローしないことError
は、より問題があるようです。