Partage via


21 Exceptions

21.1 Général

Les exceptions en C# fournissent un moyen structuré, uniforme et sécurisé de gérer les conditions d’erreur au niveau du système et au niveau de l’application.

21.2 Causes des exceptions

Les exceptions peuvent être levées de deux façons différentes.

  • Une throw instruction (§13.10.6) lève une exception immédiatement et inconditionnellement. Le contrôle n’atteint jamais l’instruction immédiatement après le throw.
  • Certaines conditions exceptionnelles qui surviennent pendant le traitement des instructions et expressions C# entraînent la levée d’une exception dans certaines circonstances lorsque l’opération ne peut pas être terminée normalement. Consultez le §21.5 pour obtenir la liste des différentes exceptions pouvant être levées de cette façon.

    Exemple : une opération de division entière (§12.10.3) lève une System.DivideByZeroException valeur si le dénominateur est égal à zéro. exemple de fin

21.3 La classe System.Exception

La System.Exception classe est le type de base de toutes les exceptions. Cette classe a quelques propriétés notables que toutes les exceptions partagent :

  • Message est une propriété en lecture seule de type string qui contient une description lisible par l’homme de la raison de l’exception.
  • InnerException est une propriété en lecture seule de type Exception. Si sa valeur n’est pasnull, elle fait référence à l’exception qui a provoqué l’exception actuelle. (Autrement dit, l’exception actuelle a été levée dans un bloc catch qui gère le InnerExceptionfichier .) Sinon, sa valeur est null, indiquant que cette exception n’a pas été provoquée par une autre exception. Le nombre d’objets d’exception chaînés de cette façon peut être arbitraire.

La valeur de ces propriétés peut être spécifiée dans les appels au constructeur d’instance pour System.Exception.

21.4 Comment les exceptions sont gérées

Les exceptions sont gérées par une try instruction (§13.11).

Lorsqu’une exception est levée (§21.2), le système recherche la clause catch la plus proche qui peut gérer l’exception, comme déterminé par le type d’exécution de l’exception. Tout d’abord, la méthode actuelle recherche une instruction lexicale englobante try , et les clauses associées catch de l’instruction sont considérées dans l’ordre try . Si cela échoue, la méthode qui a appelé la méthode actuelle est recherchée pour obtenir une instruction lexicale try englobante qui entoure le point de l’appel à la méthode actuelle. Cette recherche se poursuit jusqu’à ce qu’une catch clause soit trouvée qui peut gérer l’exception actuelle, en nommant une classe d’exception qui est de la même classe ou une classe de base, du type d’exécution de l’exception levée. Une catch clause qui ne nomme pas de classe d’exception peut gérer n’importe quelle exception.

Une fois qu’une clause de correspondance catch est trouvée, le système se prépare à transférer le contrôle vers la première instruction de la catch clause. Avant que l’exécution de la catch clause commence, le système s’exécute d’abord, dans l’ordre, toutes finally les clauses associées à try des instructions plus imbriquées que celles qui ont intercepté l’exception.

Si aucune clause correspondante catch n’est trouvée :

  • Si la recherche d’une clause correspondante catch atteint un constructeur statique (§15.12) ou un initialiseur de champ statique, une System.TypeInitializationException exception est levée au point qui a déclenché l’appel du constructeur statique. L’exception interne du System.TypeInitializationException fichier contient l’exception qui a été levée à l’origine.
  • Sinon, si une exception se produit pendant l’exécution du finaliseur et que cette exception n’est pas interceptée, le comportement n’est pas spécifié.
  • Sinon, si la recherche de clauses correspondantes catch atteint le code qui a démarré initialement le thread, l’exécution du thread est arrêtée. L’impact de cette terminaison est défini par l’implémentation.

21.5 Classes d’exception courantes

Les exceptions suivantes sont levées par certaines opérations C#.

Type d'exception Description
System.ArithmeticException Classe de base pour les exceptions qui se produisent pendant des opérations arithmétiques, telles que System.DivideByZeroException et System.OverflowException.
System.ArrayTypeMismatchException Levée lorsqu’un magasin dans un tableau échoue, car le type de l’élément stocké n’est pas compatible avec le type du tableau.
System.DivideByZeroException Levée lorsqu’une tentative de division d’une valeur intégrale par zéro se produit.
System.IndexOutOfRangeException Levée lorsqu’une tentative d’indexer un tableau via un index inférieur à zéro ou en dehors des limites du tableau.
System.InvalidCastException Levée lorsqu’une conversion explicite d’un type de base ou d’une interface vers un type dérivé échoue au moment de l’exécution.
System.NullReferenceException Levée lorsqu’une null référence est utilisée de manière à ce que l’objet référencé soit requis.
System.OutOfMemoryException Levée lorsqu’une tentative d’allocation de mémoire (via new) échoue.
System.OverflowException Levée quand une opération dans un contexte checked engendre un dépassement.
System.StackOverflowException Levée lorsque la pile d’exécution est épuisée en ayant trop d’appels en attente ; indique généralement une récursivité très profonde ou non entrante.
System.TypeInitializationException Levée lorsqu’un constructeur statique ou un initialiseur de champ statique lève une exception et qu’aucune clause n’existe catch pour l’intercepter.