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

Usando um bloco finally, você pode limpar todos os recursos alocados em um bloco try e pode executar código mesmo se uma exceção ocorrer no bloco try.By using a finally block, you can clean up any resources that are allocated in a try block, and you can run code even if an exception occurs in the try block. Normalmente, as instruções de um bloco finally são executadas quando o controle deixa uma instrução try.Typically, the statements of a finally block run when control leaves a try statement. A transferência de controle pode ocorrer como resultado da execução normal, da execução de uma instrução break, continue, goto ou return, ou da propagação de uma exceção para fora da instrução try.The transfer of control can occur as a result of normal execution, of execution of a break, continue, goto, or return statement, or of propagation of an exception out of the try statement.

Dentro de uma exceção tratada, é garantido que o bloco finally será executado.Within a handled exception, the associated finally block is guaranteed to be run. No entanto, se a exceção não for tratada, a execução do bloco finally depende de como a operação de desenrolamento da exceção é disparada.However, if the exception is unhandled, execution of the finally block is dependent on how the exception unwind operation is triggered. Isso, por sua vez, depende da configuração do seu computador.That, in turn, is dependent on how your computer is set up.

Normalmente, quando uma exceção sem tratamento encerra um aplicativo, não é importante se o bloco finally é executado.Usually, when an unhandled exception ends an application, whether or not the finally block is run is not important. No entanto, se você tiver instruções em um bloco finally que devem ser executadas mesmo nesse caso, uma solução é adicionar um bloco catch à instrução try-finally.However, if you have statements in a finally block that must be run even in that situation, one solution is to add a catch block to the try-finally statement. Como alternativa, você pode detectar a exceção que pode ser gerada no bloco try de uma instrução try-finally em posição superior na pilha de chamadas.Alternatively, you can catch the exception that might be thrown in the try block of a try-finally statement higher up the call stack. Ou seja, você pode detectar a exceção no método que chama o método que contém a instrução try-finally ou no método que chama esse método ou em qualquer método na pilha de chamadas.That is, you can catch the exception in the method that calls the method that contains the try-finally statement, or in the method that calls that method, or in any method in the call stack. Se a exceção não for detectada, a execução do bloco finally dependerá do sistema operacional escolher disparar uma operação de desenrolamento de exceção.If the exception is not caught, execution of the finally block depends on whether the operating system chooses to trigger an exception unwind operation.

ExemploExample

No exemplo a seguir, uma instrução de conversão inválida causa uma exceção System.InvalidCastException.In the following example, an invalid conversion statement causes a System.InvalidCastException exception. A exceção não é tratada.The exception is unhandled.

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 ocorre em um método mais para cima na pilha de chamadas.In the following example, an exception from the TryCast method is caught in a method farther up the call stack.

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.For more information about finally, see try-catch-finally.

C# também contém a instrução using, que fornece uma funcionalidade semelhante para objetos IDisposable em uma sintaxe conveniente.C# also contains the using statement, which provides similar functionality for IDisposable objects in a convenient syntax.

Especificação da linguagem C#C# language specification

Para obter mais informações, confira a seção A instrução try da Especificação da linguagem C#.For more information, see The try statement section of the C# language specification.

Confira tambémSee also