2014年7月22日火曜日

.NETの例外処理

http://blogs.msdn.com/b/nakama/archive/2009/01/02/net-part-1.aspx
http://blogs.msdn.com/b/nakama/archive/2009/01/02/net-part-2.aspx
を読んで、例外処理について、自分なりに理解して、まとめてみました。

例外処理について、詳細に書いてある本はないので、理解するよいと思います。

まず、
例外処理とは、「業務フローからは、はみだしてしまった想定外の事が起こった時のエラー処理」となります。
尚、例外処理は、エンドユーザーに通知してはいけません
通知するエラーは、業務エラーになります。
(業務エラーでは、NULLで返すのは、何が原因でエラーになるのか、分からないので、使用しないほうがよい

・データベース接続エラー
・ネットワークエラー
・メモリ不足
などが発生した場合に、この状況を例外処理します。

ただし、
よほどのことがない限り、アプリケーションで try-catch を書いてはいけません

例外が発生した場合に、
try~chatchを実装しないと、上位の呼び出し元に通知していきますので、最後はランタイムが例外を補足します。そして、ランタイムが例外エラーダイアログを表示します。
Windowsフォームの場合には、 Application.ThreadException イベントハンドラが自動で呼び出されます。よって、ここにエラーメッセージ通知をカスタマイズしておきます。
これらの処理をカスタマイズしておけば、try-catch による例外の後処理を個別に作り込む必要性はなくなります

どうしても、業務フローに戻りたいエラーの場合だけ、try~catchを実装します。
尚、catch文内のthrowはcatchした後でありながら、chatchしなかったことになります。

しかし、やむえず、try~chatch文を書くときは、次のようなコードにします。
try-catch ブロックは、例外が発生しうる『1 行』のみを囲む。
一般例外(Exception クラス)ではなく、特定の例外(SqlException など)のみを捕捉する。
catch した後には、必ず後処理(業務エラーへの変換など)を記述する。


ただし、try~finallyの場合は、別になります。
try-finally ブロックは、アプリケーション全体を囲む。 
一般例外(Exception クラス)すべてに対して有効になるように記述する。 
catch ブロックは書かない。  

これらを考慮にいれて、try~finallyの中にtry~chatchを入れて記述したりします。 
でも、try~catchは使わないのが原則ですけどね!。

それと、try~catchを使う場合は、リソースのメモリリークに注意してくださいね。



例外処理をあまくみていた。。。。。
そもそもC++でtry~chatchはつかっていないんだから、try~catchは使わないコードを記述しないように心掛けよう。

0 件のコメント:

コメントを投稿