Я работаю в некотором коде, который часто использует исключения для обработки определенных состояний ошибки (конечно, это не самый лучший дизайн, но это то, с чем я работаю).
Когда возникает исключениев коде мне нужен элегантный способ очистки любых открытых или временных ресурсов.
Это можно выполнить следующим образом:
try
{
foo();
bar();
}
catch (Exception)
{
// Oops, an error occurred - let's clean up resources
// Any attempt to cleanup non-existent resources will throw
// an exception, so let's wrap this in another try block
try
{
cleanupResourceFoo();
cleanupResourceBar();
}
catch
{
// A resource didn't exist - this is non-fatal so let's drop
// this exception
}
}
Допустим, что метод foo()
очищен послесам по себе, но метод bar()
вызвал исключение.В коде очистки мы будем вызывать cleanupResourceFoo()
first , что само вызовет исключение, поскольку ресурсы foo
уже очищены.
Это означает, что cleanupResourceBar()
выиграно 'В итоге вызов будет вызван утечкой ресурсов.
Конечно, мы можем переписать внутренний блок try/catch
следующим образом:
try
{
cleanupResourceFoo();
}
catch
{
}
try
{
cleanupResourceBar();
}
catch
{
}
, но теперь мыЯ становлюсь довольно уродливым.
Я пришел из C ++, и для таких вещей я бы обычно использовал RAII.Любые рекомендации по поводу элегантного способа справиться с этим в C #?