try...finally (Riferimenti per C#)

finally il blocco è utile per liberare le risorse allocate in prova blocco ed eseguire qualsiasi codice che è necessario eseguire anche se si verifica un'eccezione in try blocco.In genere, le istruzioni di un oggetto finally il blocco viene eseguito quando il controllo consente a un oggetto try istruzione, se il trasferimento di controllo viene eseguito come conseguenza di esecuzione normale, sull'esecuzione di un oggetto break, continue, goto, o return istruzione, o di propagazione di generazione di un'eccezione try istruzione.

All'interno di un'eccezione gestita, l'oggetto associato finally il blocco è sempre eseguito.Tuttavia, se l'eccezione non è gestita, di esecuzione finally il blocco dipende da come eccezione annulla l'operazione viene attivata.Che, a sua volta, dipende da come il computer è configurato.Per ulteriori informazioni, vedere Elaborazione dell'eccezione non gestita in CLR.

In genere, quando un'eccezione non gestita termina un'applicazione, indipendentemente da l finally il blocco viene eseguito non è importante.Tuttavia, se si dispone di istruzioni in un oggetto finally bloccare che deve essere eseguita anche in questo caso, una soluzione consiste nell'aggiungere un oggetto catch blocco a try-finally istruzione.In alternativa, è possibile intercettare l'eccezione che può essere generata in try blocco di un oggetto try-finally superiore dell'istruzione lo stack di chiamate.È possibile rilevare l'eccezione nel metodo che chiama il metodo contenente try-finally l'istruzione o, nel metodo che chiama il metodo, o in qualsiasi metodo nello stack di chiamate.Se l'eccezione non viene intercettata, di esecuzione finally il blocco varia a seconda che il sistema operativo scelto per attivare un'eccezione rimuove l'operazione.

Esempio

Nell'esempio seguente, un'istruzione non valida di conversione provoca un evento System.InvalidCastException eccezione.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, un'eccezione dal TryCast il metodo viene intercettata in un metodo allocato nello stack di chiamate.

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 prova-fermo-finale.

In c# sono contiene istruzione using, che fornisce un'utile sintassi per la stessa funzionalità di un oggetto try-finally istruzione.

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.

Vedere anche

Attività

Procedura: generare eccezioni in modo esplicito

Riferimenti

Parole chiave di C#

provare, intercettare e generare istruzioni (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#