try-finally (Referência C#)

Ao utilizar um finally bloco, pode limpar todos os recursos que forem atribuídos num bloco de tentativa , e pode executar código mesmo que ocorra uma exceção no try bloco. Normalmente, as declarações de um finally bloco funcionam quando o controlo deixa uma try declaração. A transferência de controlo pode ocorrer em resultado da execução normal, da execução de umbreak, gotocontinueou declaração, ou return de propagação de uma exceção fora da try declaração.

Dentro de uma exceção manuseada, o bloco associado finally é garantido para ser executado. No entanto, se a exceção não for manipulada, a finally execução do bloco depende da forma como a operação de desenrolar da exceção é desencadeada. Isso, por sua vez, depende da configuração do computador. Os únicos casos em que finally as cláusulas não são executadas envolvem um programa a ser imediatamente interrompido. Um exemplo disso seria quando InvalidProgramException é atirado por causa das declarações da IL serem corruptas. Na maioria dos sistemas operativos, a limpeza de recursos razoável será efetuada como parte da paragem e descarga do processo.

Normalmente, quando uma exceção sem mão termina uma aplicação, se o finally bloco é ou não executado não é importante. No entanto, se tiver declarações num finally bloco que deve ser executado mesmo nessa situação, uma solução é adicionar um catch bloco à try-finally declaração. Em alternativa, pode apanhar a exceção que pode ser lançada no try bloco de uma try-finally declaração mais acima da pilha de chamadas. Ou seja, pode apanhar a exceção no método que chama o método que contém a try-finally declaraçã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 for apanhada, a finally execução do bloco depende se o sistema operativo opta por desencadear uma operação de desenrolar de exceção.

Exemplo

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

public class ThrowTestA
{
    public 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 seguinte, uma exceção do TryCast método é apanhada num método mais distante da pilha de chamadas.

public class ThrowTestB
{
    public 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;
        }
    }

    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 declaração de utilização, que fornece uma funcionalidade semelhante para IDisposable objetos numa sintaxe conveniente.

Especificação linguística C#

Para mais informações, consulte a secção de demonstração de tentativa da especificação do idioma C.

Ver também