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 lethrow
. - 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 typestring
qui contient une description lisible par l’homme de la raison de l’exception.InnerException
est une propriété en lecture seule de typeException
. 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 leInnerException
fichier .) Sinon, sa valeur estnull
, 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, uneSystem.TypeInitializationException
exception est levée au point qui a déclenché l’appel du constructeur statique. L’exception interne duSystem.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. |
ECMA C# draft specification