Compartilhar via


try-finally (Referência de C#)

Usando um bloco finally, você pode limpar os recursos que são alocados em um bloco try e pode executar o código mesmo se uma exceção ocorrer no bloco try. Em geral, as instruções de um bloco finally são executadas quando o controle deixa uma instrução de try. A transferência de controle pode ocorrer como resultado da execução normal, da execução de uma declaração break, continue, goto ou return ou da propagação de uma exceção fora da declaração try .

Dentro de uma exceção manipulada, é garantido que o bloco associado finally seja executado. No entanto, se a exceção não for tratada, a execução do bloco finally será dependente de como a operação de desenrolamento da exceção será acionada. Isso, por sua vez, depende de como seu computador está configurado. Para obter mais informações, consulte Processamento de exceção sem tratamento no CLR.

Em geral, quando uma exceção não tratada encerrar um aplicativo, mesmo que o bloco finally seja ou não executado, isso não é importante. No entanto, se você tiver instruções em um bloco finally que deve ser executado mesmo nessa situação, uma solução é adicionar um bloco catch à declaração try-finally. Como alternativa, você pode capturar a exceção que pode ser apresentada no bloco try de uma instrução try-finally maior à pilha de chamadas. Ou seja, você pode capturar a exceção no método que chama o método que contém a instrução try- definally ou o método que chama esse método, ou em qualquer método na pilha de chamadas. Se a exceção não é detectada, a execução do bloco finally depende se o sistema operacional escolhe acionar uma operação de desenrolamento da exceção.

Exemplo

No exemplo a seguir, uma declaração inválida de conversão causa uma exceção de System.InvalidCastException. A exceção não é tratada.

public class ThrowTestA
{
    static void Main()
    {
        int i = 123;
        string s = "Some string";
        object obj = s;

        try
        {
            // Invalid conversion; obj contains a string, not a numeric type.
            i = (int)obj;

            // The following statement is not run.
            Console.WriteLine("WriteLine at the end of the try block.");
        }
        finally
        {
            // To run the program in Visual Studio, type CTRL+F5. Then  
            // click Cancel in the error dialog.
            Console.WriteLine("\nExecution of the finally block after an unhandled\n" +
                "error depends on how the exception unwind operation is triggered.");
            Console.WriteLine("i = {0}", i);
        }
    }
    // Output: 
    // Unhandled Exception: System.InvalidCastException: Specified cast is not valid. 
    // 
    // Execution of the finally block after an unhandled 
    // error depends on how the exception unwind operation is triggered. 
    // i = 123
}

No exemplo a seguir, uma exceção do método TryCast é detectada em um método extremo à pilha de chamadas.

public class ThrowTestB
{
    static void Main()
    {
        try
        {
            // TryCast produces an unhandled exception.
            TryCast();
        }
        catch (Exception ex)
        {
            // Catch the exception that is unhandled in TryCast.
            Console.WriteLine
                ("Catching the {0} exception triggers the finally block.",
                ex.GetType());

            // Restore the original unhandled exception. You might not 
            // know what exception to expect, or how to handle it, so pass  
            // it on. 
            throw;
        }
    }

    public static void TryCast()
    {
        int i = 123;
        string s = "Some string";
        object obj = s;

        try
        {
            // Invalid conversion; obj contains a string, not a numeric type.
            i = (int)obj;

            // The following statement is not run.
            Console.WriteLine("WriteLine at the end of the try block.");
        }
        finally
        {
            // Report that the finally block is run, and show that the value of 
            // i has not been changed.
            Console.WriteLine("\nIn the finally block in TryCast, i = {0}.\n", i);
        }
    }
    // Output: 
    // In the finally block in TryCast, i = 123. 

    // Catching the System.InvalidCastException exception triggers the finally block. 

    // Unhandled Exception: System.InvalidCastException: Specified cast is not valid.
}

Para obter mais informações sobre finally, consulte try-catch-finally.

C# também contém a instrução using, que fornece funcionalidade semelhante para objetos IDisposable em uma sintaxe conveniente.

Especificação da Linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Tarefas

Como lançar exceções explicitamente

Referência

Palavras-chave C#

Instruções try, throw e catch (C++)

Instruções para manipulação de exceções (Referência de C#)

throw (Referência de C#)

try-catch (Referência de C#)

Conceitos

Guia de Programação em C#

Outros recursos

Referência de C#