Condividi tramite


try...finally (Riferimenti per C#)

Utilizzando un blocco finally, è possibile liberare le risorse allocate in un blocco try, quindi eseguire il codice anche se viene generata un'eccezione in tale blocco try. In genere, le istruzioni di un blocco finally vengono eseguite quando il controllo lascia un'istruzione try. Il trasferimento di controllo può verificarsi come risultato della normale esecuzione, dell'esecuzione di un'istruzione break, continue, goto o return o della propagazione di un'eccezione al di fuori dell'istruzione try.

In un'eccezione gestita, il blocco finally associato viene sicuramente eseguito. Tuttavia, se l'eccezione non è gestita, l'esecuzione del blocco finally dipende da come viene attivata l'operazione di rimozione eccezione. Questa, a sua volta, dipende dalla configurazione del computer. Per ulteriori informazioni, vedere Elaborazione delle eccezioni non gestite in CRL.

In genere, quando un'eccezione non gestita termina un'applicazione, che il blocco finally sia eseguito o meno non è importante. Tuttavia, se si dispone di istruzioni in un blocco finally che devono essere eseguite anche in tale situazione, una soluzione è di aggiungere un blocco catch all'istruzione try-finally. In alternativa, è possibile rilevare l'eccezione che può essere generata nel blocco try di un'istruzione try-finally collocata nella parte superiore dello stack di chiamate. È possibile rilevare l'eccezione nel metodo che chiama il metodo contenente l'istruzione try-finally o nel metodo che chiama quel metodo o in qualsiasi metodo dello stack di chiamate. Se l'eccezione non viene rilevata, l'esecuzione del blocco finally dipende dall'attivazione o meno da parte del sistema operativo dell'operazione di rimozione eccezione.

Esempio

In questo esempio un'istruzione di conversione non valida genera un'eccezione System.InvalidCastException. L'eccezione non è gestita.

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 rilevata un'eccezione dal metodo TryCast in un metodo allocato nello stack di chiamata.

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 ulteriori informazioni su finally, vedere try-catch-finally.

C# contiene anche l'istruzione using, la quale fornisce una funzionalità simili per gli oggetti IDisposable con sintassi di facile utilizzo.

Specifiche del linguaggio C#

Per altre informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.

Vedere anche

Attività

Procedura: generare eccezioni in modo esplicito

Riferimenti

Parole chiave di C#

Istruzioni try, throw e catch (C++)

Istruzioni di gestione delle eccezioni (Riferimenti per C#)

throw (Riferimenti per C#)

try-catch (Riferimenti per C#)

Concetti

Guida per programmatori C#

Altre risorse

Riferimenti per C#