Как поймать исключение в блоке с использованием .NET 2.0? - PullRequest
4 голосов
/ 30 августа 2008

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

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


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

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

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

Ответы [ 3 ]

7 голосов
/ 30 августа 2008

Я не совсем понимаю вопрос - вы бросаете исключение, как обычно. Если MyThing реализует IDisposable, то:

using ( MyThing thing = new MyThing() )
{
    ...
    throw new ApplicationException("oops");
}

И thing.Dispose будут вызываться при выходе из блока, как исключение. Если вы хотите объединить try / catch / finally и использование, вы можете вложить их:

try
{
    ...
    using ( MyThing thing = new MyThing() )
    {
        ...
    }
    ...
}
catch ( Exception e )
{
    ....
}
finally
{
    ....
}    

(или поместите try / catch / finally в использование):

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 - Я не думаю, что есть какой-то другой способ выполнить то, что вы хотите.

4 голосов
/ 30 августа 2008

Да, нет ничего особенного в выдаче исключений при использовании блоков. Помните, что блок using в основном означает:

IDisposable disposable = null;
try
{
    disposable = new WhateverYouWantedToMake();
}
finally
{
    disposable.Dispose()
}

Таким образом, вам придется бросить свой собственный лов, если вы хотите поймать что-нибудь, но ловля / бросание - это совершенно отдельная задача, связанная с использованием. И наконец почти гарантированно выполнится выполнение (за исключением неуловимого исключения (например, переполнение стека или выход из памяти) или кого-то, кто отключит питание от ПК).

0 голосов
/ 22 мая 2010

Вы должны иметь оператор try, чтобы поймать исключение

Либо вы можете использовать оператор try внутри блока using, либо вы можете использовать блок using в блоке try

Но вам нужно использовать блок try, чтобы перехватывать любые возникающие исключения

...