try...finally (Riferimenti per C#)try-finally (C# Reference)

Usando un blocco finally, è possibile eliminare le risorse allocate in un blocco try ed è possibile eseguire codice anche se viene generata un'eccezione di blocco 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. In genere, le istruzioni di un blocco finally vengono eseguite quando il controllo lascia un'istruzione try.Typically, the statements of a finally block run when control leaves a try statement. Il trasferimento del controllo può verificarsi come risultato dell'esecuzione normale, dell'esecuzione di un'istruzione break, continue, goto o return o della propagazione di un'eccezione dell'istruzione 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.

All'interno di un'eccezione gestita, l'esecuzione del blocco finally associato è garantita.Within a handled exception, the associated finally block is guaranteed to be run. Tuttavia, se l'eccezione non è gestita, l'esecuzione del blocco finally dipende da come viene attivata l'operazione di rimozione dell'eccezione.However, if the exception is unhandled, execution of the finally block is dependent on how the exception unwind operation is triggered. Ciò, a sua volta, dipende da come viene configurato il computer.That, in turn, is dependent on how your computer is set up.

In genere, quando un'eccezione non gestita termina un'applicazione non è importante sapere se il blocco finally è in esecuzione.Usually, when an unhandled exception ends an application, whether or not the finally block is run is not important. Tuttavia, se si dispone di istruzioni in un blocco finally che deve essere eseguito anche in questo caso, una soluzione consiste nell'aggiungere un blocco catch all'istruzione 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. In alternativa, è possibile intercettare l'eccezione che potrebbe essere generata nel blocco try di un'istruzione try-finally in alto nello stack di chiamate.Alternatively, you can catch the exception that might be thrown in the try block of a try-finally statement higher up the call stack. Vale a dire, è possibile intercettare l'eccezione nel metodo che chiama il metodo che contiene l'istruzione try-finally, nel metodo che chiama questo metodo o in qualsiasi metodo nello stack di chiamate.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 non viene rilevata l'eccezione, l'esecuzione del blocco finally varia a seconda che il sistema operativo scelga di generare un'operazione di rimozione dell'eccezione o meno.If the exception is not caught, execution of the finally block depends on whether the operating system chooses to trigger an exception unwind operation.

EsempioExample

Nell'esempio seguente un'istruzione di conversione non valida causa un'eccezione System.InvalidCastException.In the following example, an invalid conversion statement causes a System.InvalidCastException exception. L'eccezione viene non è gestita.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
}

Nell'esempio seguente viene intercettata un'eccezione del metodo TryCast in un metodo nella parte più in alto dello stack di chiamate.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.
}

Per altre informazioni su finally, vedere try-catch-finally.For more information about finally, see try-catch-finally.

C# contiene anche l'istruzione using, che fornisce funzionalità simili per gli oggetti IDisposable con una sintassi comoda.C# also contains the using statement, which provides similar functionality for IDisposable objects in a convenient syntax.

Specifiche del linguaggio C#C# language specification

Per altre informazioni, vedere la sezione Istruzione try della specifica del linguaggio C#.For more information, see The try statement section of the C# language specification.

Vedere ancheSee also