try-finally (référence C#)

En utilisant un bloc finally, vous pouvez nettoyer toutes les ressources allouées dans un bloc try et vous pouvez exécuter du code même si une exception se produit dans le bloc try. En règle générale, les instructions d’un bloc finally s’exécutent lorsque le contrôle quitte une instruction try. Le transfert de contrôle peut se produire suite à une exécution normale, à l’exécution d’une instruction break, continue, goto ou return, ou à la propagation d’une exception hors de l’instruction try.

Dans une exception gérée, le bloc finally associé est assuré d’être exécuté. Toutefois, si l’exception n’est pas gérée, l’exécution du bloc finally dépend de la manière dont l’opération de déroulement d’exception est déclenchée. Ceci, à son tour, dépend du paramétrage de votre ordinateur. Pour plus d’informations, consultez Traitement d’une exception non prise en charge dans le CLR.

En général, lorsqu’une exception non gérée met fin à une application, que le bloc finally soit exécuté ou non n’est pas important. Toutefois, si vous avez des instructions dans un bloc finally qui doivent être exécutées même dans cette situation, une solution consiste à ajouter un bloc catch à l’instruction try-finally. Ou bien, vous pouvez intercepter l’exception qui peut être levée dans le bloc try d’une instruction try-finally plus haut dans la pile des appels. Autrement dit, vous pouvez intercepter l’exception dans la méthode qui appelle la méthode contenant l’instruction try-finally, ou dans la méthode qui appelle cette méthode, ou dans n’importe quelle méthode figurant dans la pile des appels. Si l’exception n’est pas interceptée, l’exécution du bloc finally varie selon que le système d’exploitation choisit de déclencher une opération de déroulement d’exception.

Exemple

Dans l’exemple suivant, une instruction de conversion non valide provoque une exception System.InvalidCastException. L’exception n’est pas gérée.

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
}

Dans l’exemple suivant, une exception issue de la méthode TryCast est interceptée dans une méthode plus loin dans la pile des appels.

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.
}

Pour plus d’informations sur finally, consultez try-catch-finally.

C# contient également l’instruction using, qui fournit des fonctionnalités similaires pour les objets IDisposable dans une syntaxe pratique.

Spécification du langage C#

Pour plus d'informations, voir la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.

Voir aussi

Informations de référence sur C#
Guide de programmation C#
Mots clés C#
Instructions try, throw et catch (C++)
Instructions de gestion des exceptions
throw
try-catch
Guide pratique pour lever explicitement des exceptions