これは私にとって非常に奇妙です。 RuntimeException
はを継承するException
を継承します。例外をキャッチしてRuntimeExceptionをキャッチしないのはなぜですか?
catch(Exception exc) { /* won't catch RuntimeException */
しかし
catch(Throwable exc) { /* will catch RuntimeException */
私はそれが未チェックだという点でRuntimeException
が特別であることを知っています。しかし、私の理解には、例外が宣言されなければならないかどうかだけでなく、彼らが捕らえられているかどうかにも当てはまります。そして、それでも、私はこのロジックがThrowableを捕まえることでなぜ破壊されるのか分かりません。
ターミナル操作でRuntimeExceptionsがスローされる可能性があるので、これは私にとってはかなり関係しています。私はこのパターンの名前はわかりませんが、私のクラスEmailRoller
はCallbacks
の配列をとります。コードは次のようになります。
for(Callback cb : callbacks) {
try {
cb.call(item);
}
catch(Exception exc) {
logger.error("Error in callback: ", exc);
}
}
だから、これはOOMEのようなものは、これらのコールバックのいずれかが、すべてのマシンのメモリを消費している場合ので、フライスルーする必要がある場合は、その確認などheckがの実行に影響を与えるために起こっている、あります他のもの。しかし、NullPointerException
?またはIndexOutOfBoundsException
?これらはコールバックに影響しますが、他のコールが実行されるのを妨げません。
また、これはエンタープライズデザインのビットです。異なるプログラマやチームがコールバックを追加してアイテムを処理することはできますが、それらは互いに分離する必要があります。これは、これらのコールバックを互いに絶縁する役割を担うプログラマとして、エラーが伝播しないようにすることを頼りにするべきではないということです。キャッチException
は正しい行に近いはずですが、RuntimeException
がスリップするためではありません。ですから、私のより一般的な質問は、ここで良いパターンは何ですか?ちょうどcatch(Exception | RuntimeException exc)
、私はそれが継承のために構文エラーであると信じていますか?
私のコードを再読み込みしてください。そのとおりです。私の絶縁層はバグだった。ランタイム例外はNPEだった 'if(results.foo.bar()){/ * apply callback * /}'から来たからだ。 – djechlin
@djechlin:あなたの投稿は* show * 'if(results.foo.bar())'を表示しません - あなたが実際にこの時点で尋ねていることは非常に不明です... –