Exceptions et gestion des exceptions

Les fonctionnalités de gestion des exceptions du langage C# vous aident à gérer les situations inattendues ou exceptionnelles qui se produisent lorsqu’un programme est en cours d’exécution. La gestion des exceptions utilise le try, catchet finally les mots clés pour essayer des actions qui peuvent ne pas réussir, pour gérer les défaillances lorsque vous décidez qu’il est raisonnable de le faire et de nettoyer les ressources par la suite. Les exceptions peuvent être générées par le Common Language Runtime (CLR), par les bibliothèques .NET ou tierces, ou par code d’application. Les exceptions sont créées avec le mot clé throw.

Dans de nombreux cas, une exception peut être levée non pas par une méthode appelée directement par votre code, mais par une autre méthode plus loin dans la pile des appels. Lorsqu’une exception est levée, le CLR décompresse la pile, en recherchant une méthode avec un catch bloc pour le type d’exception spécifique, et exécute le premier catch bloc qu’il trouve. S’il ne trouve pas de bloc catch dans la pile des appels, il termine le processus et affiche un message à l’utilisateur.

Dans cet exemple, une méthode teste la division par zéro et intercepte l’erreur. Sans la gestion des exceptions, ce programme se terminerait avec une erreur DivideByZeroException non gérée.

public class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    }

    public static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result;

        try
        {
            result = SafeDivision(a, b);
            Console.WriteLine("{0} divided by {1} = {2}", a, b, result);
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

Vue d’ensemble des exceptions

Les exceptions ont les propriétés suivantes :

  • Les exceptions sont des types qui dérivent tous en définitive de System.Exception.
  • Utilisez un bloc try autour des instructions qui peuvent lever des exceptions.
  • Dès qu’une exception se produit dans le bloc try, le flux de contrôle passe immédiatement au premier gestionnaire d’exceptions associé présent dans la pile des appels. En C#, le mot clé catch est utilisé pour définir un gestionnaire d’exceptions.
  • Si aucun gestionnaire d’exceptions n’est présent pour une exception donnée, le programme s’arrête avec un message d’erreur.
  • N’interceptez pas d’exception, sauf si vous pouvez la gérer et laisser l’application dans un état connu. Si vous interceptez System.Exception, levez-la de nouveau avec le mot clé throw à la fin du bloc catch.
  • Si un bloc catch définit une variable d’exception, vous pouvez l’utiliser pour obtenir plus d’informations sur le type d’exception qui s’est produit.
  • Les exceptions peuvent être générées explicitement par un programme avec le mot clé throw.
  • Les objets Exception contiennent des informations détaillées sur l'erreur, telles que l'état de la pile des appels et une description du texte de l'erreur.
  • Le code d’un finally bloc est exécuté indépendamment de la levée d’une exception. Utilisez un bloc finally pour libérer des ressources, par exemple pour fermer tous les flux ou fichiers qui ont été ouverts dans le bloc try.
  • Les exceptions managées dans .NET sont implémentées par-dessus le mécanisme de gestion des exceptions structurées Win32. Pour plus d’informations, consultez les pages Gestion structurée des exceptions (C/C++) et Cours intensif sur la gestion structurée des exceptions de Win32.

Spécification du langage C#

Pour plus d’informations, consultez Exceptions dans 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