Я пытаюсь использовать блок using все больше и больше в наши дни, когда у меня есть объект, реализующий IDisposable, но я не понял одной вещи, как поймать исключение, как в обычном try / catch / finally ... какие-нибудь образцы кода, которые укажут мне правильное направление?
Обновлено: вопрос был изменен после прочтения ответов. Это было «Как создать исключение в блоке using с .NET 2.0?» но на самом деле я искал способ перехвата этих исключений внутри блока using.
Я ищу более подробную информацию о том, как катить мой собственный блок ловли внутри блока using.
Обновлено: чего я хотел избежать, так это использовать try / catch / finally внутри моего блока using, как показал @Blair. Но, может быть, это не проблема ...
Обновлено: @Blair, это именно то, что я искал, спасибо за подробный ответ!


Да, в исключениях при использовании блоков нет ничего особенного. Помните, что блок using в основном переводится как:
IDisposable disposable = null;
try
{
disposable = new WhateverYouWantedToMake();
}
finally
{
disposable.Dispose()
}
Таким образом, вам придется катить свою собственную ловлю, если вы хотите что-то поймать, но ловля / бросание - это совершенно отдельная проблема от использования. Окончательное выполнение почти гарантировано (за исключением неуловимого исключения (например, stackoverflow или outofmemory) или кто-то отключит питание от ПК).
Я действительно не понимаю вопроса - вы генерируете исключение, как обычно.
Если MyThing реализует IDisposable, то:
using ( MyThing thing = new MyThing() )
{
...
throw new ApplicationException("oops");
}
И thing.Dispose будет вызываться при выходе из блока при возникновении исключения. Если вы хотите объединить try / catch / finally и using, вы можете либо вложить их:
try
{
...
using ( MyThing thing = new MyThing() )
{
...
}
...
}
catch ( Exception e )
{
....
}
finally
{
....
}
(Или вставьте try / catch / finally в using):
using ( MyThing thing = new MyThing() )
{
...
try
{
...
}
catch ( Exception e )
{
....
}
finally
{
....
}
...
} // thing.Dispose is called now
Или вы можете развернуть using и явно вызвать Dispose в блоке finally, как продемонстрировал @Quarrelsome, добавив любой дополнительный код обработки исключений или -recovery, который вам нужен в finally (или в catch).
Обновлено: В ответ на @Toran Billups, если вам нужно обработать исключения, помимо обеспечения вызова вашего метода Dispose, вам придется либо использовать using и try/catch/finally, либо развернуть using - я не думаю, что есть другой способ для достижения того, что вы хотите.
У вас должен быть оператор try, чтобы поймать исключение
Либо вы можете использовать оператор try в блоке using, либо вы можете использовать блок using в блоке try
Но вам нужно использовать блок try, чтобы перехватывать любые возникающие исключения.