あなたがスタッククラスを書いていると想像してください。クラスに例外処理コードを配置しないでください。その結果、次の例外が生成される可能性があります。
- ArrayIndexError-ユーザーが空のスタックからポップしようとすると発生します
- NullPtrException-実装のバグによりnull参照を参照しようとしたために発生
例外をラップする単純なアプローチでは、これらの例外の両方をStackError例外クラスにラップすることがあります。ただし、これは例外をラップするポイントを実際に見逃しています。オブジェクトが低レベルの例外をスローした場合、オブジェクトが壊れていることを意味します。ただし、これが許容される場合が1つあります。オブジェクトが実際に壊れている場合です。
例外をラップするポイントは、オブジェクトが通常のエラーに対して適切な例外を与える必要があるということです。空のスタックからポップする場合、スタックはArrayIndexErrorではなくStackEmptyを発生させる必要があります。その目的は、オブジェクトまたはコードが破損した場合に他の例外をスローすることを避けることではありません。
私たちは本当に避けたいことは、高レベルのオブジェクトを通過してきた低レベルの例外をキャッチされました。空のスタックからポップするときにArrayIndexErrorをスローするスタッククラスは、小さな問題です。そのArrayIndexErrorを実際にキャッチすると、深刻な問題が発生します。低レベルのエラーの伝播は、それらをキャッチするよりもはるかに深刻な罪です。
これをSQLExceptionの例に戻すと、なぜSQLExceptionが発生しますか?1つの理由は、無効なクエリを渡すためです。ただし、データアクセスレイヤーが不適切なクエリを生成している場合は、破損しています。DataAccessFailure例外で破損を再ラップしようとしてはなりません。
ただし、データベースへの接続が失われると、SQLExceptionが発生する可能性もあります。その時点での私の戦略は、防御の最終段階で例外をキャッチし、データベース接続が失われたことをユーザーに報告してシャットダウンすることです。アプリケーションはデータベースにアクセスできなくなるため、実際に実行できることはあまりありません。
あなたのコードがどのように見えるかわかりません。しかし、あなたは盲目的にすべての例外をより高いレベルの例外に変換しているように思えます。比較的少数の場合にのみそれを行うべきです。最も低いレベルの例外は、コードのバグを示しています。それらをキャッチして再ラップすると、逆効果になります。