La bibliothèque standard utilise le mécanisme des exceptions du langage pour signaler les erreurs qui peuvent se produire à l'exécution au sein de ses fonctions. Elle définit pour cela un certain nombre de classes d'exceptions standards, que toutes les fonctionnalités de la bibliothèque sont susceptibles d'utiliser. Ces classes peuvent être utilisées telles quelles ou servir de classes de base à des classes d'exceptions personnalisées pour vos propres développements.
Ces classes d'exception sont presque toutes déclarées dans l'en-tête stdexcept, et dérivent de la classe de base exception. Cette dernière n'est pas déclarée dans le même en-tête et n'est pas utilisée directement, mais fournit les mécanismes de base de toutes les exceptions de la bibliothèque standard. Elle est déclarée comme suit dans l'en-tête exception :
class exception { public: exception() throw(); exception(const exception &) throw(); exception &operator=(const exception &) throw(); virtual ~exception() throw(); virtual const char *what() const throw(); };
Outre les constructeurs, opérateurs d'affectation et destructeurs
classiques, cette classe définit une méthode what
qui retourne une chaîne
de caractères statique. Le contenu de cette chaîne de caractères n'est pas normalisé. Cependant,
il sert généralement à décrire la nature de l'erreur qui s'est produite. C'est une méthode virtuelle,
car elle est bien entendu destinée à être redéfinie par les classes d'exception spécialisées pour
les différents types d'erreurs. Notez que toutes les méthodes de la classe exception
sont déclarées comme ne pouvant pas lancer d'exceptions elle-mêmes, ce qui est naturel puisque l'on
est déjà en train de traiter une exception lorsqu'on manipule des objets de cette classe.
L'en-tête exception contient
également la déclaration de la classe d'exception bad_exception. Cette classe n'est,
elle aussi, pas utilisée en temps normal. Le seul cas où elle peut être lancée est dans le traitement
de la fonction de traitement d'erreur qui est appelée par la fonction
std::unexpected
lorsqu'une exception a provoqué la sortie d'une fonction
qui n'avait pas le droit de la lancer. La classe bad_exception est déclarée comme suit
dans l'en-tête exception :
class bad_exception : public exception { public: bad_exception() throw(); bad_exception(const bad_exception &) throw(); bad_exception &operator=(const bad_exception &) throw(); virtual ~bad_exception() throw(); virtual const char *what() const throw(); };
Notez que l'exception bad_alloc lancée par les gestionnaires
de mémoire lorsque l'opérateur new
ou l'opérateur new[]
n'a pas réussi à faire une allocation n'est pas déclarée dans l'en-tête
stdexcept non plus. Sa déclaration a été placée avec celle
des opérateurs d'allocation mémoire, dans l'en-tête new.
Cette classe dérive toutefois de la classe exception, comme le montre sa déclaration :
class bad_alloc : public exception { public: bad_alloc() throw(); bad_alloc(const bad_alloc &) throw(); bad_alloc &operator=(const bad_alloc &) throw(); virtual ~bad_alloc() throw(); virtual const char *what() const throw(); };
Les autres exceptions sont classées en deux grandes catégories. La première catégorie regroupe toutes les exceptions dont l'apparition traduit sans doute une erreur de programmation dans le programme, car elles ne devraient jamais se produire à l'exécution. Il s'agit des exceptions dites « d'erreurs dans la logique du programme » et, en tant que telles, dérivent de la classe d'exception logic_error. Cette classe est déclarée comme suit dans l'en-tête stdexcept :
class logic_error : public exception { public: logic_error(const string &what_arg); };Elle ne contient qu'un constructeur, permettant de définir la chaîne de caractères qui sera renvoyée par la méthode virtuelle
what
. Ce constructeur prend en paramètre cette chaîne
de caractères sous la forme d'un objet de la classe string. Cette classe est définie
par la bibliothèque standard afin de faciliter la manipulation des chaînes de caractères et sera décrite
plus en détail dans la Section 14.1.
Les classes d'exception qui dérivent de la classe logic_error disposent également d'un constructeur similaire. Ces classes sont les suivantes :
la classe domain_error, qui spécifie qu'une fonction a été appelée avec des paramètres sur lesquels elle n'est pas définie. Il faut contrôler les valeurs des paramètres utilisées lors de l'appel de la fonction qui a lancé cette exception ;
la classe invalid_argument, qui spécifie qu'un des arguments d'une méthode ou d'une fonction n'est pas valide. Cette erreur arrive lorsqu'on utilise des valeurs de paramètres qui n'entrent pas dans le cadre de fonctionnement normal de la méthode appelée ; cela traduit souvent une mauvaise utilisation de la fonctionnalité correspondante ;
la classe length_error, qui indique qu'un dépassement de capacité maximale d'un objet a été réalisé. Ces dépassements se produisent dans les programmes bogués, qui essaient d'utiliser une fonctionnalité au delà des limites qui avaient été fixées pour elle ;
la classe out_of_range, qui spécifie qu'une valeur située en dehors de la plage de valeurs autorisées a été utilisée. Ce type d'erreur signifie souvent que les paramètres utilisés pour un appel de fonction ne sont pas corrects ou pas initialisés, et qu'il faut vérifier leur validité.
La deuxième catégorie d'exceptions correspond aux erreurs qui ne peuvent pas toujours être corrigées lors de l'écriture du programme, et qui font donc partie des événements naturels qui se produisent lors de son exécution. Elles caractérisent les erreurs d'exécution, et dérivent de la classe d'exception runtime_error. Cette classe est déclarée de la manière suivante dans l'en-tête stdexcept :
class runtime_error : public exception { public: runtime_error(const string &what_arg); };Elle s'utilise exactement comme la classe logic_error.
Les exceptions de la catégorie des erreurs d'exécution sont les suivantes :
la classe range_error, qui signifie qu'une valeur est sortie de la plage de valeurs dans laquelle elle devait se trouver suite à un débordement interne à la bibliothèque ;
la classe overflow_error, qui signifie qu'un débordement par valeurs supérieures s'est produit dans un calcul interne à la bibliothèque ;
la classe underflow_error, qui signifie qu'un débordement par valeurs inférieures s'est produit dans un calcul interne à la bibliothèque.
Précédent | Sommaire | Suivant |
Services et notions de base de la bibliothèque standard | Niveau supérieur | Abstraction des types de données : les traits |