web-dev-qa-db-fra.com

stdexcept vs exception Headers en c ++

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?

25
darth_coder
  • <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.

34
101010

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::exceptionstd::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.

12
Maxim Egorushkin

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

0
snakedoctor