マイクロソフトがアプリケーションブロックを導入して以来、私は例外処理アプリケーションブロックを使用する人々にぶつかっています。私は最近自分自身を詳しく調べて、基本的な機能を次のように要約します(それが何をするかをすでに知っている場合は、次のブロックをスキップしてください):
例外処理アプリケーションブロックは、次の主要な例外処理タスクを一元化し、構成ファイルで完全に構成可能にすることを目的としています。
- 例外のログ記録
- 例外の置き換え
- 例外のラッピング
- 例外の伝播
- 等
ライブラリは、trycatchブロックを次のように変更することでこれを行います。
try { // Run code. } catch(DataAccessException ex) { bool rethrow = ExceptionPolicy.HandleException(ex, "Data Access Policy"); if (rethrow) { throw; } }
ポリシー名のapp.configで指定されている内容(ドキュメントについてはこちらを参照)に基づいて、HandleExceptionは...
- 完全に新しい例外をスローします(元の例外を置き換えます)
- 元の例外を新しい例外でラップし、それをスローします
- 例外を飲み込む(つまり何もしない)
- 元の例外を再スローしますか
さらに、事前にさらに多くのことを実行するように構成することもできます(たとえば、例外をログに記録します)。
ここに私の問題があります。例外が置き換えられるか、ラップされるか、飲み込まれるか、または再スローされるかにかかわらず、構成可能にすることがどのように有益であるかを完全に理解できません。私の経験では、例外処理の動作を変更するときに周囲のコードまたは呼び出し元のコードを変更する必要があるため、この決定はコードを作成するときに行う必要があります。
たとえば、特定のポイントでスローされた特定の例外が再スローされるのではなく飲み込まれるように再構成すると、コードが正しく動作しなくなる可能性があります(catchブロックの後に、例外が発生したときに実行してはならないコードがある場合があります)。例外処理で考えられる他のすべての変更についても同じことが言えます(たとえば、replace-> rethrow、swallow-> wrap)。
したがって、私にとって重要なのは、例外処理ブロックが実際には存在しない問題を解決するということです。例外のロギングと通知ビットは問題ありませんが、他のすべてのものはオーバーエンジニアリングの完璧な例ではありませんか?