Compartir a través de


try-finally (Referencia de C#)

El bloque de finally es útil para limpiar los recursos que se asigna en el bloque de intento , y ejecutar cualquier código que deba ejecutarse incluso si se produce una excepción en el bloque de try .Normalmente, las instrucciones de un bloque de finally se ejecutan cuando el control permite una instrucción de try , si la transferencia del control aparece como resultado de la ejecución normal, la ejecución de break, de continue, de goto, o la instrucción de return , o de propagación de una excepción de la instrucción de try .

Dentro de una excepción controlada, el bloque asociado de finally se garantiza para ejecutarse.Sin embargo, si la excepción no controlada, la ejecución del bloque de finally depende de cómo se desencadena la excepción desenreda la operación.Esto, a su vez, depende de cómo el equipo está configurado.Para obtener más información, vea Procesamiento de excepción no controlada en CLR.

Normalmente, a una excepción no controlada finaliza una aplicación, si se ejecuta el bloque de finally no es importante.Sin embargo, si tiene instrucciones en finally bloqueado que debe ejecutarse incluso en esa situación, una solución es agregar catch bloqueado a la instrucción de try- definally .Alternativamente, puede detectar la excepción que se produzca en el bloque de try de una instrucción de try- definally situado 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 al método, o en cualquier método en la pila de llamadas.Si la excepción no se detecta, la ejecución del bloque de finally depende de si el sistema operativo elija para desencadenar una excepción desenreda la operació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 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 sobre finally, vea intento-captura-final.

C# también contiene mediante la instrucción, que proporciona una sintaxis apropiada para la misma funcionalidad que la instrucción de try- definally .

Especificación del lenguaje C#

Para obtener más información, vea 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#

try, catch, e instrucciones throw (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#