Comment : exécuter le code de nettoyage à l'aide de finally (Guide de programmation C#)

Mise à jour : novembre 2007

L'objectif d'une instruction finally est de garantir que le nettoyage nécessaire d'objets, généralement d'objets qui contiennent des ressources externes, se produise immédiatement, même en cas de levée d'exception. Un exemple de nettoyage de ce type est d'appeler Close sur un FileStream immédiatement après utilisation au lieu d'attendre que l'objet soit récupéré par garbage collection par le common language runtime, comme suit :

static void CodeWithoutCleanup()
{
    System.IO.FileStream file = null;
    System.IO.FileInfo fileInfo = new System.IO.FileInfo("C:\\file.txt");

    file = fileInfo.OpenWrite();
    file.WriteByte(0xF);

    file.Close();
}

Exemple

Pour transformer le code précédent en instruction try-catch-finally, le code de nettoyage est séparé du code actif, comme suit.

static void CodeWithCleanup()
{
    System.IO.FileStream file = null;
    System.IO.FileInfo fileInfo = null;

    try
    {
        fileInfo = new System.IO.FileInfo("C:\\file.txt");

        file = fileInfo.OpenWrite();
        file.WriteByte(0xF);
    }
    catch(System.UnauthorizedAccessException e)
    {
        System.Console.WriteLine(e.Message);
    }
    finally
    {
        if (file != null)
        {
            file.Close();
        }
    }
}

Une exception pouvant arriver n'importe quand dans le bloc try avant l'appel à OpenWrite() ou l'appel OpenWrite() lui-même pouvant échouer, nous n'avons aucune garantie que le fichier est ouvert lorsque nous essayons de le fermer. Le bloc finally ajoute un contrôle pour s'assurer que l'objet FileStream n'est pas null avant d'appeler la méthode Close. Sans le contrôle null, le bloc finally peut lever sa propre NullReferenceException, mais la levée d'exceptions dans des blocs finally doit être évitée si possible.

Une connexion à une base de données est également susceptible d'être fermée dans un bloc finally. Le nombre de connexions autorisé à un serveur de base de données étant quelquefois limité, vous devez fermer les connexions de base de données aussi rapidement comme possible. Si une exception est levée avant que vous puissiez fermer votre connexion, il est préférable d'utiliser le bloc finally plutôt que d'attendre le garbage collection.

Voir aussi

Concepts

Guide de programmation C#

Référence

Exceptions et gestion des exceptions (Guide de programmation C#)

Gestion des exceptions (Guide de programmation C#)

using, instruction (Référence C#)

try-catch (Référence C#)

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

try-catch-finally (Référence C#)