Как перехватить исключение в блоке using с .NET 2.0?

Я пытаюсь использовать блок using все больше и больше в наши дни, когда у меня есть объект, реализующий IDisposable, но я не понял одной вещи, как поймать исключение, как в обычном try / catch / finally ... какие-нибудь образцы кода, которые укажут мне правильное направление?

Обновлено: вопрос был изменен после прочтения ответов. Это было «Как создать исключение в блоке using с .NET 2.0?» но на самом деле я искал способ перехвата этих исключений внутри блока using.


Я ищу более подробную информацию о том, как катить мой собственный блок ловли внутри блока using.

Обновлено: чего я хотел избежать, так это использовать try / catch / finally внутри моего блока using, как показал @Blair. Но, может быть, это не проблема ...

Обновлено: @Blair, это именно то, что я искал, спасибо за подробный ответ!

Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
4
0
3 888
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Да, в исключениях при использовании блоков нет ничего особенного. Помните, что блок 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, чтобы перехватывать любые возникающие исключения.

Другие вопросы по теме