150 votes

Différence: std :: runtime_error vs std :: exception ()

Quelle est la différence entre std::runtime_error et std::exception ? Quelle est l'utilisation appropriée pour chacun? Pourquoi sont-ils différents en premier lieu?

171voto

AndreyT Points 139512

std::exception est la classe dont le seul but est de servir la classe de base à l'exception de la hiérarchie. Il n'a pas d'autres utilisations. En d'autres termes, sur le plan conceptuel, il est un résumé de la classe (même si elle n'est pas définie comme une classe abstraite en C++ sens du terme).

std::runtime_error est plus classe spécialisée, descendant std::exception, destiné à être jeté dans le cas de plusieurs d'exécution des erreurs. Il a un double objectif. Il peut être levée par elle-même, ou il peut servir comme une classe de base pour divers encore plus de types spécialisés de l'erreur d'exécution des exceptions, comme std::range_error, std::overflow_error etc. Vous pouvez définir vos propres classes d'exception descendant std::runtime_error, ainsi que vous pouvez définir vos propres classes d'exception descendant std::exception.

Tout comme std::runtime_error, de la bibliothèque standard contient std::logic_error, aussi descendant d' std::exception.

L'intérêt de cette hiérarchie est de donner à l'utilisateur la possibilité d'utiliser toute la puissance de la gestion des exceptions C++ mécanisme. Depuis "attraper" clause peut attraper polymorphes exceptions, l'utilisateur peut écrire "attraper" les clauses qui peut attraper les types d'exception à partir d'un sous-arbre de l'exeption de la hiérarchie. Par exemple, catch (std::runtime_error& e) va attraper toutes les exceptions std::runtime_error sous-arbre, laissant tous les autres à passer à travers (et de voler plus haut dans la pile d'appel).

P. S. la Conception d'une utile d'exception hiérarchie de classe (qui serait vous faire attraper seulement les types d'exception qui vous intéresse sur chaque point de code) est une tâche non triviale. Ce que vous voyez dans la bibliothèque C++ standard est une approche possible, proposés par les auteurs de la langue. Comme vous le voyez, ils ont décidé de diviser tous les types d'exception dans des "erreurs d'exécution" et "les erreurs de logique" et laissez-vous proceeed à partir de là avec vos propres types d'exception. Il y a, bien sûr, d'autres moyens à la structure de la hiérarchie, qui pourrait être plus approprié dans votre conception.

24voto

Loki Astari Points 116129

std::exception doivent être prises en compte (note de l') l'abrégé de la base de la norme exception de la hiérarchie. C'est parce qu'il n'y a pas de mécanisme pour transmettre un message spécifique (pour ce faire, vous devez tirer et de se spécialiser, ce()). Il n'y a rien pour vous arrêter à l'aide de std::exception et simple de l'application, il peut être tout ce dont vous avez besoin.

std::runtime_error sur l'autre main a valide les constructeurs qui acceptent une chaîne de caractères comme un message. Lorsque ce() est appelé un const char pointeur retourné points à une chaîne C qui a la même chaîne que était passé dans le constructeur.

try
{
    if (badThingHappened)
    {    throw std::runtime_error("Something Bad happened here");
    }
}
catch(std::exception const& e)
{
    std::cout << "Exception: " << e.what() << "\n";
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X