Looking for c# Keywords? Try Ask4Keywords

C# Language Gotcha: исключение в методе Dispose маскирование других ошибок в использовании блоков


пример

Рассмотрим следующий блок кода.

try
{
    using (var disposable = new MyDisposable())
    {
        throw new Exception("Couldn't perform operation.");
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

class MyDisposable : IDisposable
{
    public void Dispose()
    {
        throw new Exception("Couldn't dispose successfully.");
    }
}

Вы можете ожидать увидеть «Не удалось выполнить операцию», напечатанную на консоли, но на самом деле вы увидите «Не удалось успешно утилизировать». поскольку метод Dispose все еще вызывается даже после того, как будет выбрано первое исключение.

Стоит осознавать эту тонкость, поскольку она может маскировать реальную ошибку, которая препятствовала тому, чтобы объект был удален, и затруднить его отладку.