2008年4月10日木曜日

[.NET]例外の処理

最近のオブジェクト指向言語には、言語仕様に例外処理の機構が組み込まれています。 c#の場合、こんな感じですね。

try
{
    //例外の発生する可能性のある処理
}
catch (Exception ex)
{
    //例外の出た場合の処理
}
finally
{
    //リソースの開放処理
}


しかし、処理の方法が人によりまちまちで、困る場合があります。
たとえば、
  • 入力チェックに例外処理を利用している
  • 事前にチェックすれば発生しない例外の考慮をしている
  • 握りつぶしてはマズイ例外を握りつぶしている
  • 例外処理をしているが、資源の解放漏れがある
  • そもそも例外の発生を考慮していない

などあります。そこで、何かいいガイドラインは無いかと思って調べてみると、MSDNにそれらしいことが記載してありました。
その中で「Exception 基本クラスからユーザー定義例外を派生しないでください。ほとんどのアプリケーションでは、ApplicationException クラスからカスタム例外を派生します。 」
とありますが、@it掲示板によるとApplicationExceptionからの派生はあまりよくないとのことらしい。

私の解釈は、以下のとおりです。

  • 握りつぶしてよい例外以外はcatchしない
  • (基本的に無いけど)catchした場合、その例外をまたはシステム共通の例外をthrowしなおす
  • 例外処理は一箇所で行う。同時にここでログ(デバッグ用)を出力する(ASP.NETの場合、Application_Error。WindowsFormの場合Application.ThreadExceptionで処理する)

例外のハンドリング方法としてはちょっと古いかも知れませんが、まぁコレが今のところ一番いいかなぁと思っています。

ちょっといまさら感がありますが、例外処理に関してはEnterprise Library(EHAB)があります。今度こっちを調査いてみよう。



あ、資源の解放という点ではfinallyよりusingで処理します(C#)。

0 件のコメント: