むやみにキャッチしないでね。ゴールキーパー以外はハンドで反則ですよ。

まぁ、そんなわけで、私が書いているコードはほとんどTry-Catch-Finallyではなく、Try-Finallyばかりだ。
正当な理由がある(Catchする事に意味がある。)時や、付加情報を付けて再Throwしたい時くらいしかcatchしない。
では何処でcatchしているかというと、global.asaxのApplication_Errorイベント内。
ここに例外が飛んできたら、イベントログに、その内容を書き出してDebugモード時は画面にも例外の内容を、Releaseモード時は「ご迷惑をお掛けしています。」ページに遷移するようにしている。

では、なぜむやみにcatchしては駄目かと言えば、

  • 正当な理由がないのにcatchして例外を消してしまうと、一見うまく行っているような動作をしてしまう
  • そのため傷口がどんどん広がる。
  • そのためバグが発覚しにくい。
  • 発覚した時には手遅れになっている可能性がある。
  • 事前条件に基づいてメソッドの先頭で例外をThrowするようにしているとより効果的。

逆に、正当な理由が無いものについては個別にcatchしないでAppication_Errorで一元管理すると何が良いかと言えば、

  • 起きてほしくない例外を漏らさす知る事ができる。
  • そのためバグがすぐ発覚する。
  • つまり、それを潰す機会が早期に与えられる。

また、

  • 想定外の例外に対して、そこら中にエラー処理を記述する実装だと、エラー処理を記述し忘れる不具合が発生する可能性があるが、それが無い。
  • 不必要で不可解なコードを作り込まない。
  • 結果的にシンプルかつ見通しが良くなる。

一応、上記の根拠に沿って、こういう実装をしているわけです。

もし、そこら中で意味も無くcatchしているとしたら、それはバグ許容宣言をしているようなものなので、やめた方が良いでしょう。

Share
カテゴリー: .NET