Как поймать исключение в блоке с использованием .NET 2.0?

StackOverflow https://stackoverflow.com/questions/36081

Вопрос

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

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

<Ч>

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

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

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

Это было полезно?

Решение

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

Или вы можете развернуть используя и явно вызвать Dispose в блоке finally , как продемонстрировано в @Quarrelsome, добавив любую дополнительную обработку исключений или -восстановление кода, который вам нужен, в finally (или в catch ).

РЕДАКТИРОВАТЬ: В ответ на @Toran Billups, если вам нужно обрабатывать исключения, помимо обеспечения того, что вызывается ваш метод Dispose , вы должны будете либо использовать using и try / catch / finally или разверните с помощью - я не думаю, что есть какой-то другой способ выполнить то, что вы хотите.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top