Можете ли вы поймать в блоке использования?
Можно ли перехватывать исключения внутри блока 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();
}
}