2004年12月16日

try-catch-finallyについて考える(2)

   このエントリーをはてなブックマークに追加 Clip to Evernote
昨日の続き
では、「finally処理に対応する初期処理は、try ブロックの中に入れてしまう」というルールに沿って書いた次のコードを見てみましょう。
    // sample2-1
SqlCommand cmd = new SqlCommand(sqltext,conn);
try {
SqlDataReader dr = cmd.ExecuteReader();
// 何らかの処理
} catch ( SqlException ex ) {
MessageBox.Show(ex.Message);
} finally {
dr.Close();
}

ExecuteReadに対応する後処理が、dr.Close です。一見よさそうですが、このコードでは、ローカル変数 drの有効範囲は、try ブロックの中なので、finally 部分で、コンパイルエラーになってしまいます。そのため、以下のように書かなくてはなりません。
    // sample2-2
SqlCommand cmd = new SqlCommand(sqltext,conn);
SqlDataReader dr = null;
try {
dr = cmd.ExecuteReader();
// 何らかの処理
} catch ( SqlException ex ) {
MessageBox.Show(ex.Message);
} finally {
if ( dr != null )
dr.Close();
}

うーーん、でもこれだと、C#の宣言と初期化を一緒にできるというメリットを活かせません。それに、finally で null かどうかを判断するのは、なんかエレガントでは無いように感じます。
(続く)


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/10868033