Поделиться через


Практическое руководство. Выполнение кода очистки с использованием блока finally (Руководство по программированию на C#)

Инструкция finally предназначена для обеспечения немедленного выполнения необходимой очистки объектов, обычно занимающих внешние ресурсы, даже в случае, когда генерируется исключение. Примером подобной очистки является вызов метода Close для объекта класса FileStream сразу после его использования, не дожидаясь, когда этот объект будет уничтожен сборщиком мусора среды CLR, как показано ниже:

static void CodeWithoutCleanup()
{
    System.IO.FileStream file = null;
    System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:\\file.txt");

    file = fileInfo.OpenWrite();
    file.WriteByte(0xF);

    file.Close();
}

Пример

Чтобы превратить предыдущий код в инструкцию try-catch-finally, код очистки отделяется от рабочего кода, как показано ниже.

static void CodeWithCleanup()
{
    System.IO.FileStream file = null;
    System.IO.FileInfo fileInfo = null;

    try
    {
        fileInfo = new System.IO.FileInfo("C:\\file.txt");

        file = fileInfo.OpenWrite();
        file.WriteByte(0xF);
    }
    catch(System.UnauthorizedAccessException e)
    {
        System.Console.WriteLine(e.Message);
    }
    finally
    {
        if (file != null)
        {
            file.Close();
        }
    }
}

Так как исключение может произойти в любой момент внутри блока try до вызова метода OpenWrite() или ошибкой может завершится выполнение самого метода OpenWrite(), при выполнении попытки закрыть файл нет гарантии, что он открыт. Блок finally добавляет проверку, чтобы убедиться, что объект класса FileStream не имеет значения null, прежде чем вызывать метод Close. При отсутствии проверки значения null блок finally может сам генерировать исключение NullReferenceException, но генерирования исключений в блоках finally по возможности следует избегать.

Подключение к базе данных является еще одним кандидатом на закрывание в блоке finally. Так как допустимое число подключений к серверу базы данных иногда ограничено, их следует закрывать как можно быстрее. Если исключение генерируется прежде, чем можно закрыть подключение, то это еще один случай, когда лучше применить блок finally, чем ждать выполнения сборки мусора.

См. также

Ссылки

Исключения и обработка исключений (Руководство по программированию в C#)

Обработка исключений (Руководство по программированию на C#)

Оператор using (Справочник по C#)

try-catch (Справочник по C#)

try-finally (Справочник по C#)

try-catch-finally (Справочник по C#)

Основные понятия

Руководство по программированию на C#