ExceptionsExceptions

Les exceptions en C# offrent un moyen structuré, uniforme et de type sécurisé de gestion des conditions d’erreur au niveau du système et au niveau de l’application.Exceptions in C# provide a structured, uniform, and type-safe way of handling both system level and application level error conditions. Le mécanisme d’exception en C# est très similaire à celui de C++, avec quelques différences importantes :The exception mechanism in C# is quite similar to that of C++, with a few important differences:

  • En C#, toutes les exceptions doivent être représentées par une instance d’un type de classe dérivé de System.Exception .In C#, all exceptions must be represented by an instance of a class type derived from System.Exception. En C++, toute valeur de tout type peut être utilisée pour représenter une exception.In C++, any value of any type can be used to represent an exception.
  • En C#, un bloc finally (instruction try) peut être utilisé pour écrire un code d’arrêt qui s’exécute à la fois dans une exécution normale et dans des conditions exceptionnelles.In C#, a finally block (The try statement) can be used to write termination code that executes in both normal execution and exceptional conditions. Ce code est difficile à écrire en C++ sans duplication de code.Such code is difficult to write in C++ without duplicating code.
  • En C#, les exceptions au niveau système telles que le dépassement de capacité, la division par zéro et les déréférencements null ont des classes d’exception bien définies et sont associées à des conditions d’erreur au niveau de l’application.In C#, system-level exceptions such as overflow, divide-by-zero, and null dereferences have well defined exception classes and are on a par with application-level error conditions.

Causes des exceptionsCauses of exceptions

Une exception peut être levée de deux façons différentes.Exception can be thrown in two different ways.

  • Une throw instruction (instruction throw) lève une exception immédiatement et sans condition.A throw statement (The throw statement) throws an exception immediately and unconditionally. Le contrôle n’atteint jamais l’instruction qui suit immédiatement throw .Control never reaches the statement immediately following the throw.
  • Certaines conditions exceptionnelles qui se produisent pendant le traitement des instructions et expressions C# provoquent une exception dans certaines circonstances lorsque l’opération ne peut pas être effectuée normalement.Certain exceptional conditions that arise during the processing of C# statements and expression cause an exception in certain circumstances when the operation cannot be completed normally. Par exemple, une opération de division entière (opérateur de division) lève une System.DivideByZeroException si le dénominateur est égal à zéro.For example, an integer division operation (Division operator) throws a System.DivideByZeroException if the denominator is zero. Consultez classes d’exceptions communes pour obtenir la liste des différentes exceptions qui peuvent se produire de cette façon.See Common Exception Classes for a list of the various exceptions that can occur in this way.

System.Exception, classeThe System.Exception class

La System.Exception classe est le type de base de toutes les exceptions.The System.Exception class is the base type of all exceptions. Cette classe possède quelques propriétés notables que toutes les exceptions partagent :This class has a few notable properties that all exceptions share:

  • Message est une propriété en lecture seule de type string qui contient une description explicite de la raison de l’exception.Message is a read-only property of type string that contains a human-readable description of the reason for the exception.
  • InnerException est une propriété en lecture seule de type Exception .InnerException is a read-only property of type Exception. Si sa valeur n’est pas null, 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 InnerException .If its value is non-null, it refers to the exception that caused the current exception—that is, the current exception was raised in a catch block handling the InnerException. Sinon, sa valeur est null, ce qui indique que cette exception n’a pas été provoquée par une autre exception.Otherwise, its value is null, indicating that this exception was not caused by another exception. Le nombre d’objets d’exception chaînés ensemble de cette manière peut être arbitraire.The number of exception objects chained together in this manner can be arbitrary.

La valeur de ces propriétés peut être spécifiée dans les appels au constructeur d’instance pour System.Exception .The value of these properties can be specified in calls to the instance constructor for System.Exception.

Gestion des exceptionsHow exceptions are handled

Les exceptions sont gérées par une try instruction (instruction try).Exceptions are handled by a try statement (The try statement).

Quand une exception se produit, le système recherche la clause la plus proche catch qui peut gérer l’exception, comme déterminé par le type au moment de l’exécution de l’exception.When an exception occurs, the system searches for the nearest catch clause that can handle the exception, as determined by the run-time type of the exception. Tout d’abord, la méthode actuelle recherche une instruction englobante lexicale try , et les clauses catch associées de l’instruction try sont considérées dans l’ordre.First, the current method is searched for a lexically enclosing try statement, and the associated catch clauses of the try statement are considered in order. En cas d’échec, la méthode qui a appelé la méthode actuelle fait l’objet d’une recherche d’une instruction englobante lexicale try qui encadre le point de l’appel à la méthode actuelle.If that fails, the method that called the current method is searched for a lexically enclosing try statement that encloses the point of the call to the current method. Cette recherche se poursuit jusqu’à ce qu’une catch clause pouvant gérer l’exception actuelle soit trouvée, en nommant une classe d’exception qui est de la même classe, ou une classe de base, du type au moment de l’exécution de l’exception levée.This search continues until a catch clause is found that can handle the current exception, by naming an exception class that is of the same class, or a base class, of the run-time type of the exception being thrown. Une catch clause qui ne nomme pas une classe d’exception peut gérer n’importe quelle exception.A catch clause that doesn't name an exception class can handle any exception.

Une fois qu’une clause catch correspondante est trouvée, le système se prépare à transférer le contrôle à la première instruction de la clause catch.Once a matching catch clause is found, the system prepares to transfer control to the first statement of the catch clause. Avant le début de l’exécution de la clause catch, le système exécute pour la première fois, dans l’ordre, toutes les finally clauses associées à des instructions Try plus imbriquées que celle qui a intercepté l’exception.Before execution of the catch clause begins, the system first executes, in order, any finally clauses that were associated with try statements more nested that than the one that caught the exception.

Si aucune clause catch correspondante n’est trouvée, l’une des deux situations suivantes se produit :If no matching catch clause is found, one of two things occurs:

  • Si la recherche d’une clause catch correspondante atteint un constructeur statique (constructeurs statiques) ou un initialiseur de champ statique, une System.TypeInitializationException est levée au point qui a déclenché l’appel du constructeur statique.If the search for a matching catch clause reaches a static constructor (Static constructors) or static field initializer, then a System.TypeInitializationException is thrown at the point that triggered the invocation of the static constructor. L’exception interne de System.TypeInitializationException contient l’exception qui a été levée à l’origine.The inner exception of the System.TypeInitializationException contains the exception that was originally thrown.
  • Si la recherche de clauses catch correspondantes atteint le code qui a démarré initialement le thread, l’exécution du thread se termine.If the search for matching catch clauses reaches the code that initially started the thread, then execution of the thread is terminated. L’impact d’une telle terminaison est défini par l’implémentation.The impact of such termination is implementation-defined.

Les exceptions qui se produisent pendant l’exécution du destructeur méritent une mention spéciale.Exceptions that occur during destructor execution are worth special mention. Si une exception se produit pendant l’exécution du destructeur et que cette exception n’est pas interceptée, l’exécution de ce destructeur est terminée et le destructeur de la classe de base (le cas échéant) est appelé.If an exception occurs during destructor execution, and that exception is not caught, then the execution of that destructor is terminated and the destructor of the base class (if any) is called. S’il n’existe aucune classe de base (comme dans le cas du object type) ou s’il n’existe aucun destructeur de classe de base, l’exception est ignorée.If there is no base class (as in the case of the object type) or if there is no base class destructor, then the exception is discarded.

Classes d’exceptions courantesCommon Exception Classes

Les exceptions suivantes sont levées par certaines opérations C#.The following exceptions are thrown by certain C# operations.

System.ArithmeticException Classe de base pour les exceptions qui se produisent pendant des opérations arithmétiques, telles que System.DivideByZeroException et System.OverflowException.A base class for exceptions that occur during arithmetic operations, such as System.DivideByZeroException and System.OverflowException.
System.ArrayTypeMismatchException Levée lorsqu’un magasin dans un tableau échoue parce que le type réel de l’élément stocké est incompatible avec le type réel du tableau.Thrown when a store into an array fails because the actual type of the stored element is incompatible with the actual type of the array.
System.DivideByZeroException Levée lorsqu’une tentative de division d’une valeur intégrale par zéro se produit.Thrown when an attempt to divide an integral value by zero occurs.
System.IndexOutOfRangeException Levée lors d’une tentative d’indexation d’un tableau via un index inférieur à zéro ou en dehors des limites du tableau.Thrown when an attempt to index an array via an index that is less than zero or outside the bounds of the array.
System.InvalidCastException Levée lorsqu’une conversion explicite d’un type de base ou d’une interface en type dérivé échoue au moment de l’exécution.Thrown when an explicit conversion from a base type or interface to a derived type fails at run time.
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.Thrown when a null reference is used in a way that causes the referenced object to be required.
System.OutOfMemoryException Levée lors de l’échec d’une tentative d’allocation de mémoire (via new ).Thrown when an attempt to allocate memory (via new) fails.
System.OverflowException Levée quand une opération dans un contexte checked engendre un dépassement.Thrown when an arithmetic operation in a checked context overflows.
System.StackOverflowException Levée lorsque la pile d’exécution est épuisée par un trop grand nombre d’appels de méthode en attente ; en général, une récurrence très profonde ou non liée.Thrown when the execution stack is exhausted by having too many pending method calls; typically indicative of very deep or unbounded recursion.
System.TypeInitializationException Levée lorsqu’un constructeur statique lève une exception et catch qu’il n’existe aucune clause pour l’intercepter.Thrown when a static constructor throws an exception, and no catch clauses exists to catch it.