Compartilhar via


Como executar código de limpeza usando finally (Guia de Programação em C#)

A finalidade de um finally instrução é para garantir que a limpeza necessária de objetos, normalmente os objetos que estão mantendo a recursos externos, ocorre imediatamente, mesmo se uma exceção é lançada. Um exemplo de tal limpeza está chamando Close em um FileStream imediatamente após o uso em vez de esperar para o objeto a ser lixo coletado pelo common language runtime, da seguinte maneira:

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();
}

Exemplo

Para ativar o código anterior em um try-catch-finally a instrução, o código de limpeza é separada do código de trabalho, da seguinte maneira.

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();
        }
    }
}

Porque uma exceção pode ocorrer a qualquer momento dentro do try bloquear antes do OpenWrite() chamar, ou o OpenWrite() própria chamada pode falhar, nós não são garantidas que o arquivo está aberto quando tentamos para fechá-la. O finally bloco adiciona uma verificação para certificar-se de que o FileStream o objeto não é null antes de chamar o Close método. Sem o null verificar, o finally bloco poderia lançar sua própria NullReferenceException, mas gerar exceções finally blocos devem ser evitados se possível.

Uma conexão de banco de dados é outro bom candidato sendo fechado um finally bloco. Como o número de conexões permitidas para um servidor de banco de dados, às vezes, é limitado, você deve fechar conexões de banco de dados o mais rápido possível. Se uma exceção é lançada antes de fechar a conexão, este é outro caso onde usar o finally bloco é melhor do que esperar para coleta de lixo.

Consulte também

Referência

Exceções e manipulação de exceções (Guia de Programação em C#)

Manipulação de exceções (Guia de Programação em C#)

Instrução using (Referência de C#)

try-catch (Referência de C#)

try-finally (Referência de C#)

try-catch-finally (Referência de C#)

Conceitos

Guia de Programação em C#