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. Les seuls cas où finally les clauses ne s’exécutent pas impliquent l’arrêt immédiat d’un programme. Par exemple, quand InvalidProgramException est levée en raison de la corruption des instructions IL. Sur la plupart des systèmes d’exploitation, un nettoyage raisonnable des ressources sera effectué dans le cadre de l’arrêt et du déchargement du processus.

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
{
    public 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
{
    public 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;
        }
    }

    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, consultez la section Instruction try de la spécification du langage C#.

Voir aussi