Представьте, что на C# (в .NET 4.5.x) у вас есть блок using
вокруг объекта, который реализует IDisposible
. Представьте себе, чтоЛовля исключений в Dispose во время исключения
- исключение выбрасывается в использовании блока
- когда метод Dispose называется, дополнительное исключение
Каков наилучший способ передать два исключения глобальной обработчик ошибок?
Пример кода:
class SampleClass : IDisposable
{
void doSomething()
{
// Imagine that this code is actually doing something
// Except that it unexpectedly hits an exception
throw new Exception("Exception A");
}
void Dispose()
{
// Imagine that this code is doing some cleanup
// Except that it is buggy
// And throws more exceptions
throw new Exception("Exception B");
}
}
static void Main()
{
try
{
using(var c = new SampleClass())
{
c.doSomething();
}
}
catch (Exception e)
{
// Code that records and reports exceptions
RecordException(e);
}
}
В приведенном выше примере, я хочу, чтобы все детали как Exception A
и Exception B
записаны. Каков наилучший способ передать два исключения в RecordException
?
This article предлагает расширение SafeUsingBlock
. Это установленная передовая практика?
Edit: В этом случае я контролировать и может повторно написать SampleClass
и SampleClass.Dispose()
Вы можете создать свой собственный обработчик глобального исключения и/или чешский из Log4Net, довольно простой способ войти вещи в содержание вашего сердца. –
Dispose() никогда не должен генерировать исключение. Попытка рассуждать «что, если это так или иначе» довольно бесполезно и никогда не заставит вас прийти к правильному решению. Вам придется отложить с помощью критического финализатора, который вряд ли удастся выработать, или вытащить пробку с помощью Environment.FailFast(). Выньте вилку. –
@ HansPassant - см. Мою заметку ниже о '' Task.Dispose() '' –