Hatena::ブログ(Diary)

NAL-6295の舌先三寸 このページをアンテナに追加 RSSフィード

2005年09月09日(金)

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

まぁ、そんなわけで、私が書いているコードはほとんどTry-Catch-Finallyではなく、Try-Finallyばかりだ。

正当な理由がある(Catchする事に意味がある。)時や、付加情報を付けて再Throwしたい時くらいしかcatchしない。

では何処でcatchしているかというと、global.asaxのApplication_Errorイベント内。

ここに例外が飛んできたら、イベントログに、その内容を書き出してDebugモード時は画面にも例外の内容を、Releaseモード時は「ご迷惑をお掛けしています。」ページに遷移するようにしている。


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


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

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


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

また、


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

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


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


基本的に自分を含めて人の能力過小評価する姿勢で、コーディングする事が肝要であり、今回の例外に関する話もその一環です。

#カテゴリからASP.NETを外し、.NETのみとしました。(2006/07/13)

#finallyをfinalyとしていた恥ずかしいミスを修正。(2006/08/02)

aspxaspx 2005/09/09 18:25 むやみにキャッチして何もしていないロジックを発見...
orz

NAL-6295NAL-6295 2005/09/09 19:52 それは、切なすぎる・・・Orz

おぎわらおぎわら 2005/11/01 16:35 VB.NET って、 try でリターン押すと、
catch
かいてくれてしまうんですよね・・・
で、そのまま使う人が結構いて、
運用時にどこで障害がおこったかわからない
という顛末に・・・

「ゴールキーパー以外はハンドで反則ですよ。」は名言ですね〜(^-^)つかわせてもらおっと(ぉぃ

NAL-6295NAL-6295 2005/11/01 22:03 そうなんですよね。VB.NET。
どうせなら、Finaly補完して欲しいところです。
なかには、考えもせずにcatchして当然と思っている人もいて、ちゃんと説明すると驚かれます。

なまえなまえ 2009/05/24 02:43 どこぞの掲示板から飛んできました。
この名言、使わせて頂きます。というか、リンクを貼っても良いですか?

今回のプロジェクトリーダーが「Try〜Catch → return bool」を強要したため、まさにここに記載されているそのまんまです。

途中参加のため今から変更も受け入れてもらえず、どうした物やら…

NAL-6295NAL-6295 2009/05/24 02:54 ありがとうございます。
どうぞ、リンクして下さい。
途中から入ると、大変ですよね。
頑張って説得するか、あきらめるか。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証