Compartir a través de


try-finally (Referencia de C#)

Utilizando un bloque finally, puede limpiar los recursos que se asignan en un bloque try, y puede ejecutar código incluso si se produce una excepción en el bloque try. Normalmente, las instrucciones de un bloque finally se ejecuta cuando el control sale de una instrucción try. La transferencia del control puede producirse como resultado de la ejecución normal, de la ejecución de la instrucción break, continue, goto o return, o de la propagación de una excepción fuera de la instrucción try .

Dentro de una excepción controlada, se garantiza que el bloque asociado finally pueda ejecutarse. Sin embargo, si la excepción no se controla, la ejecución del bloque de finally depende de cómo se desencadena la operación de desenredo de excepción. Esto, a su vez, depende de cómo se configurar el equipo. Para obtener más información, vea Procesamiento de excepciones no controladas en CLR.

Normalmente, cuando una excepción no controlada finaliza una aplicación, si se ejecuta o no el bloque finally no es importante. Sin embargo, si tiene instrucciones en un finally bloqueado que debe ejecutarse incluso en esa situación, una solución es agregar un catch bloqueado a la instrucción try-finally. Alternativamente, puede detectar la excepción que se produzca en el bloque try de una instrucción try- definally situada más arriba de la pila de llamadas. Es decir, puede detectar la excepción en el método que llama al método que contiene la instrucción de try- definally, o en el método que llama a ese método, o en cualquier método de la pila de llamadas. Si la excepción no se detecta, la ejecución del bloque de finally depende de si el sistema operativo elige desencadenar una operación de desenredo de excepción.

Ejemplo

En el ejemplo siguiente, una instrucción no válida de conversión provoca una excepción de System.InvalidCastException. La excepción es no controlada.

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
}

En el ejemplo siguiente, una excepción del método de TryCast se detecta en un método más arriba en la pila de llamadas.

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 obtener más información acerca de finally, vea try-catch-finally.

C# también contiene la instrucción using, que proporciona funcionalidad similar para los objetos IDisposable en una sintaxis adecuada.

Especificación del lenguaje C#

Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea también

Tareas

Cómo: Iniciar excepciones explícitamente

Referencia

Palabras clave de C#

Instrucciones try, throw y catch (C++)

Instrucciones para el control de excepciones (Referencia de C#)

throw (Referencia de C#)

try-catch (Referencia de C#)

Conceptos

Guía de programación de C#

Otros recursos

Referencia de C#