これは私にとって非常に奇妙です。RuntimeException
から継承しException
、から継承しThrowable
ます。
catch(Exception exc) { /* won't catch RuntimeException */
しかし
catch(Throwable exc) { /* will catch RuntimeException */
私RuntimeException
はそれがチェックされていないという点で特別であることを知っています。しかし、私の理解では、例外がキャッチされるかどうかではなく、例外を宣言する必要があるかどうかにのみ適用されます。それでも、このロジックが をキャッチすると壊れる理由がわかりませんThrowable
。
RuntimeException
ターミナル操作でスローされる可能性がある状況があるため、これは私にとって非常に重要です。このパターンの名前はわかりませんが、たとえば、私のクラスEmailRoller
はCallbacks
. コードは次のようになります。
for(Callback cb : callbacks) {
try {
cb.call(item);
}
catch(Exception exc) {
logger.error("Error in callback: ", exc);
}
}
したがって、これは OOME のようなものがフライスルーする必要がある場合です。これらのコールバックの 1 つがすべてのマシン メモリを消費すると、他のコールバックの実行に確実に影響するからです。しかし、NullPointerException
?またはIndexOutOfBoundsException
?これらはコールバックに影響しますが、他の実行を妨げることはありません。
また、これは少しエンタープライズ向けの設計です。さまざまなプログラマーまたはチームがコールバックを追加してアイテムを処理できますが、それらは互いに分離する必要があります。つまり、これらのコールバックを相互に分離する責任を負うプログラマーとして、エラーがすり抜けないようにするためにコールバックに頼るべきではないということです。キャッチException
は正しいラインである必要がありますが、それはRuntimeException
すり抜けるからではありません。したがって、私のより一般的な質問は次のとおりです。ここで良いパターンは何ですか? ただcatch(Exception | RuntimeException exc)
、継承による構文エラーだと思いますか?