Share via


try-finally (referência de C#)

O finally bloco é útil para limpar todos os recursos são alocados a tente bloquear e para executar qualquer código que deve ser executado mesmo se uma exceção ocorre na try bloco.Normalmente, as declarações de um finally bloco são executados quando o controle saia um try instrução, se a transferência de controle ocorre como resultado da execução normal, da execução de um break, continue, goto, ou return instrução, ou de propagação de uma exceção da try instrução.

Dentro de uma exceção manipulada, os associados finally bloco é garantido para ser executado.No entanto, se a exceção é descontrolada, execução do finally bloco depende de como a exceção desenrolar a operação é acionado.Que, por sua vez, depende como seu computador está configurado.Para obter mais informações, consulte Processamento de exceção sem tratamento no CLR.

Normalmente, quando uma exceção não tratada termina um aplicativo, ou não o finally bloco está sendo executado não é importante.No entanto, se você tiver as instruções em um finally bloco que deve ser executado mesmo nessa situação, uma solução é adicionar um catch bloco para o try-finally instrução.Como alternativa, você pode capturar a exceção que pode ser gerada na try bloquear de um try-finally têm um alto cargo na pilha de chamadas de instrução.Ou seja, você pode capturar a exceção no método que chama o método que contém o try-finally instrução, ou no método que chama esse método, ou em qualquer método na pilha de chamadas.Se a exceção não é detectada, execução da finally bloco depende se o sistema operacional escolhe acionar uma exceção desenrolar a operação.

Exemplo

No exemplo a seguir, uma instrução de conversão inválido faz com que uma System.InvalidCastException exceção.A exceção é sem tratamento.

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 a partir do TryCast método for pego em um método ainda mais para cima a 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 o usando a instrução, que fornece uma sintaxe conveniente para a mesma funcionalidade que um try-finally instrução.

Especificação da linguagem C#

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

Consulte também

Tarefas

Como: lançar exceções explicitamente

Referência

Palavras-chave C#

Tente, catch e throw instruções (C++)

Instruções (C# Reference) de manipulação de exceção

Lançar (C# Reference)

try-catch (referência de C#)

Conceitos

Guia de programação do C#

Outros recursos

Referência de C#