Можете ли вы поймать в блоке использования?

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

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

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

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

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

4 ответа

Решение

Вы можете поставить попробовать / поймать внутри using заявление или за пределами:

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

Или же...

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

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

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

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

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(); 
}

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

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

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

using (var creatingThing = new MyCreatingThing())
{
    try
    {
    creatingThing.CreateSomething();
    }
    catch(Exception ex)
    {
        creatingThing.Rollback();
    }
}
Другие вопросы по тегам