0

データベース呼び出しの場合に try/catch ブロックを使用する方法を知っており、try/finally 構築を使用するコンテキストで "using" ディレクティブを使用する方法も知っています。

でも、混ぜてもいいですか?「using」ディレクティブを使用する場合、可能性のあるエラーを処理する必要があるため、try/catch 構築も使用できますか?

4

4 に答える 4

2

間違いなく両方を一緒に使用できます。

ブロックは基本的に、try/finally ブロックのusing単なる構文糖衣であり、必要に応じて try/finally ブロックをネストできます。

using (var foo = ...)
{
     // ...
}

これとほぼ同等です:

var foo = ...;
try
{
    // ...
}
finally
{
    foo.Dispose();
}
于 2012-10-26T07:26:19.393 に答える
1

もちろん、それを行うことができます:

using (var con = new SomeConnection()) {
    try {
        // do some stuff
    }
    catch (SomeException ex) {
        // error handling
    }
}

usingはコンパイラによって a に変換されるため、 a を a内にtry..finallyネストするのと大差ありません。try..catchtry..finally

于 2012-10-26T07:26:13.997 に答える
0

これは完全に有効です:

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

于 2012-10-26T07:28:24.090 に答える
0

次の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..catchaを a にネストするようなものtry..finallyです。「使用」しているアイテムが範囲外になったときに確実に破棄されるようにするためのショートカットとしてのみ存在します。独自のtry..catch例外処理を提供するなど、スコープ内で行うことに実際の制限はありません。

于 2012-10-26T07:31:56.003 に答える