まぁ、そんなわけで、私が書いているコードはほとんどTry-Catch-Finallyではなく、Try-Finallyばかりだ。
正当な理由がある(Catchする事に意味がある。)時や、付加情報を付けて再Throwしたい時くらいしかcatchしない。
では何処でcatchしているかというと、global.asaxのApplication_Errorイベント内。
ここに例外が飛んできたら、イベントログに、その内容を書き出してDebugモード時は画面にも例外の内容を、Releaseモード時は「ご迷惑をお掛けしています。」ページに遷移するようにしている。
では、なぜむやみにcatchしては駄目かと言えば、
- 正当な理由がないのにcatchして例外を消してしまうと、一見うまく行っているような動作をしてしまう
- そのため傷口がどんどん広がる。
- そのためバグが発覚しにくい。
- 発覚した時には手遅れになっている可能性がある。
- 事前条件に基づいてメソッドの先頭で例外をThrowするようにしているとより効果的。
逆に、正当な理由が無いものについては個別にcatchしないでAppication_Errorで一元管理すると何が良いかと言えば、
- 起きてほしくない例外を漏らさす知る事ができる。
- そのためバグがすぐ発覚する。
- つまり、それを潰す機会が早期に与えられる。
また、
- 想定外の例外に対して、そこら中にエラー処理を記述する実装だと、エラー処理を記述し忘れる不具合が発生する可能性があるが、それが無い。
- 不必要で不可解なコードを作り込まない。
- 結果的にシンプルかつ見通しが良くなる。
一応、上記の根拠に沿って、こういう実装をしているわけです。
もし、そこら中で意味も無くcatchしているとしたら、それはバグ許容宣言をしているようなものなので、やめた方が良いでしょう。