Как поймать исключение в блоке с использованием .NET 2.0?
-
09-06-2019 - |
Вопрос
В последние дни я все больше пытаюсь использовать блок 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, чтобы перехватывать любые возникающие исключения