2

using ブロック内で例外をキャッチできますか?もしそうなら、構文は何ですか?

したがって、次のようなものです。

using (var creatingThing = new MyCreatingThing())
{
    creatingThing.CreateSomething();

    catch()
    {
        creatingThing.Rollback();
    }
}

これはできますか?または、このコードを手動で (つまり、使用せずに) 記述する必要がありますか?

4

4 に答える 4

15

usingステートメントの内側または外側に try/catch を配置できます。

using (...)
{
    try
    {
        ...
    }
    catch
    {
        ...
    }
}

または...

try
{
   using (...)
   {
       ...
   }
}
catch
{
    ...
}

ただし、try ブロックなしで catch ブロックを配置することはできません。

リソース取得式によってスローされる例外をキャッチする必要があるかどうか、catch ブロックが実行される前にリソースを破棄する必要があるかどうか、catch ブロック内のリソース変数にアクセスする必要があるかどうかに基づいて、適切なものを選択してください.

于 2010-07-26T16:48:14.707 に答える
6

try...finallyコンパイラーが (usingステートメント用に)生成するブロックに暗黙的に参加させることはできません。try生成されたブロック内にネストされる別のステートメントを追加する必要があります。

using (var creatingThing = new MyCreatingThing())
{
    try
    {
        creatingThing.CreateSomething();
    }   
    catch
    {
        creatingThing.Rollback();
    }
}
于 2010-07-26T16:40:01.667 に答える
6

a using は実際には内部での try/finally であるため、そのようにコーディングする方が簡単な場合があることに注意してください。

MyCreatingThing creatingThing = null;
try
{
    creatingThing = new MyNCreatingThing())
    creatingThing.CreateSomething(); 
}    
catch() 
{ 
      Console.WriteLine("An Exception happened");
      if (creatingThing !=null)
          creatingThing.Rollback(); 
}
finally
{
      if (creatingThing !=null)
           creatingThing.Dispose(); 
}
于 2010-07-26T16:49:41.667 に答える
3

もちろん、using の中に try を追加するだけです:

using (var creatingThing = new MyCreatingThing())
{
    try
    {
    creatingThing.CreateSomething();
    }
    catch(Exception ex)
    {
        creatingThing.Rollback();
    }
}
于 2010-07-26T16:40:21.900 に答える