データベース呼び出しの場合に try/catch ブロックを使用する方法を知っており、try/finally 構築を使用するコンテキストで "using" ディレクティブを使用する方法も知っています。
でも、混ぜてもいいですか?「using」ディレクティブを使用する場合、可能性のあるエラーを処理する必要があるため、try/catch 構築も使用できますか?
データベース呼び出しの場合に try/catch ブロックを使用する方法を知っており、try/finally 構築を使用するコンテキストで "using" ディレクティブを使用する方法も知っています。
でも、混ぜてもいいですか?「using」ディレクティブを使用する場合、可能性のあるエラーを処理する必要があるため、try/catch 構築も使用できますか?
間違いなく両方を一緒に使用できます。
ブロックは基本的に、try/finally ブロックのusing
単なる構文糖衣であり、必要に応じて try/finally ブロックをネストできます。
using (var foo = ...)
{
// ...
}
これとほぼ同等です:
var foo = ...;
try
{
// ...
}
finally
{
foo.Dispose();
}
もちろん、それを行うことができます:
using (var con = new SomeConnection()) {
try {
// do some stuff
}
catch (SomeException ex) {
// error handling
}
}
using
はコンパイラによって a に変換されるため、 a を a内にtry..finally
ネストするのと大差ありません。try..catch
try..finally
これは完全に有効です:
using (var stream = new MemoryStream())
{
try
{
// Do something with the memory stream
}
catch(Exception ex)
{
// Do something to handle the exception
}
}
コンパイラはこれを次のように変換します。
var stream = new MemoryStream();
try
{
try
{
// Do something with the memory stream
}
catch(Exception ex)
{
// Do something to handle the exception
}
}
finally
{
if (stream != null)
{
stream.Dispose();
}
}
もちろん、このネストは逆方向にも機能します (using
ブロック内にブロックをネストする場合など) try...catch
。
次のusing
ような:
using (var connection = new SqlConnection())
{
connection.Open
// do some stuff with the connection
}
は、次のようなコーディングの構文上のショートカットにすぎません。
SqlConnection connection = null;
try
{
connection = new SqlConnection();
connection.Open
// do some stuff with the connection
}
finally
{
if (connection != null)
{
connection.Dispose()
}
}
つまり、はい、他の try..catch などと組み合わせることができます。try..catch
aを a にネストするようなものtry..finally
です。「使用」しているアイテムが範囲外になったときに確実に破棄されるようにするためのショートカットとしてのみ存在します。独自のtry..catch
例外処理を提供するなど、スコープ内で行うことに実際の制限はありません。