2004年12月20日

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

   このエントリーをはてなブックマークに追加 Clip to Evernote
C#には、この問題を解決する方法として、using があるようです。試してみました。
まずは、Connection の Open, Close のコードでは、
    // sample1-3
using ( SqlConnection conn = new SqlConnection(strconn) ) {
try {
conn.Open();
// 処理
} catch ( SqlException ex ) {
MessageBox.Show(ex.Message);
}
}

ExecuteRead のコードでは、
    // sample2-4
SqlCommand cmd = new SqlCommand(sqltext,conn);
using ( SqlDataReader dr = cmd.ExecuteReader() ) {
try {
//
} catch ( SqlException ex ) {
MessageBox.Show(ex.Message);
}
}

と書くことができます。
しかし、しかし、前者は、例外を補足できたのですが、残念ながら、後者は、ExecuteReader内で例外が発生した場合に、例外を補足できません。まあ、文法上、当然と言えば当然ですね。

と、ここまで書いて、例外を補足しようとしている対象が異なっているのに気が付きました。前者は、using の () の中でnewしたインスタンスの処理に対する例外を補足しようとしているのに対し、後者は、using の外側で newした cmd に対する処理の例外を補足しようとしています。

似たような処理でも、本質が異なっているものを同じ処理でまかなおうとしていることに無理があるのです。
ですから、sample2-4は以下のように書く必要がでてきます。
    // sample2-5
SqlCommand cmd = new SqlCommand(sqltext,conn);
try {
using ( SqlDataReader dr = cmd.ExecuteReader() ) {
//
}
} catch ( SqlException ex ) {
MessageBox.Show(ex.Message);
}


で、結局、結論らしい結論を出せないままです。
しいて言えば、usingを使えば、「try-catch-finally構文は、catchとfinally両方を同じtry文で書く場面はほとんどないのではないか」ということです。

(続く)



 

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

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