Можете ли вы поймать в блоке использования? - PullRequest
2 голосов
/ 26 июля 2010

Можно ли перехватывать исключения внутри блока using, и если да, то каков синтаксис?

Итак, что-то вроде следующего:

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

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

Можно ли это сделать?Или мне нужно написать этот код вручную (т.е. без использования)?

Ответы [ 4 ]

15 голосов
/ 26 июля 2010

Вы можете поместить try / catch внутри оператора using или за его пределы:

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

Или ...

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

Однако вы не можете просто поместитьблок catch без блока try.

Выберите правильный вариант, исходя из того, что вам нужно перехватывать исключения, которые вызываются выражением получения ресурса, хотите ли вы, чтобы ресурс был удален до выполнения вашего блока catchи нужен ли вам доступ к переменной ресурса в блоке catch.

6 голосов
/ 26 июля 2010

Обратите внимание, что использование - это действительно попытка / завершение под прикрытием, так что может быть проще написать код таким образом:

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(); 
}
6 голосов
/ 26 июля 2010

Вы не можете неявно подключиться к блоку try...finally, который генерирует компилятор (для оператора using).Вы должны добавить еще один оператор try, который будет вложен в сгенерированный блок:

using (var creatingThing = new MyCreatingThing())
{
    try
    {
        creatingThing.CreateSomething();
    }   
    catch
    {
        creatingThing.Rollback();
    }
}
3 голосов
/ 26 июля 2010

Конечно, просто добавьте попытку, используя:

using (var creatingThing = new MyCreatingThing())
{
    try
    {
    creatingThing.CreateSomething();
    }
    catch(Exception ex)
    {
        creatingThing.Rollback();
    }
}
...