Dans la référence cplusplus.com pour <exception>
et pour <stdexcept>
, il apparaît que <exception>
est suffisant pour la gestion des exceptions en C++ 98 ou versions ultérieures de C++.
Pourquoi C++ a-t-il deux fichiers d'en-tête pour la gestion des exceptions? Comment cela affecte-t-il mon développement? Quel en-tête devrais-je utiliser?
<stdexcept>
: définit un ensemble d'exceptions standard que la bibliothèque et les programmes peuvent utiliser pour signaler les erreurs courantes.
<exception>
: définit la classe de base (c'est-à-dire std::exception
) pour toutes les exceptions émises par les éléments de la bibliothèque standard, ainsi que pour plusieurs types et utilitaires d'aide à la gestion des exceptions.
Ainsi, <exception>
définit uniquement la classe std::exception
, alors que <stdexcept>
définit plusieurs classes héritant de std::exception
(par exemple, std::logic_error
, std::out_of_range
). C'est pourquoi <stdexcept>
inclut <exception>
.
Ils se trouvent dans des en-têtes distincts, car si vous souhaitez définir votre propre classe d'exception héritant de std::exception
(sans utiliser les classes de <stdexcept>
), vous pouvez éviter les définitions inutiles.
Une considération pratique est que <stdexcept>
requiert la définition de std::string
(les constructeurs d'exception acceptent std::string
et ont un membre de données std::string
), alors que capturer et interroger std::exception
std::string
n'est pas obligatoire.
En d'autres termes, le gestionnaire std::exception
n'a besoin que de <exception>
. Le site de projection nécessite l'en-tête d'une classe d'exception particulière qu'il lève.
exception permet à l'utilisateur d'hériter et de définir ses propres exceptions.
stdexcept est utilisé pour intercepter et gérer les exceptions standard