96 votes

Dois-je hériter de std::exception?

J'ai vu au moins une source fiable (une classe C++, j'ai pris) de recommander à la demande spécifique de classes d'exceptions en C++ devrait hériter de std::exception. Je ne suis pas clair sur les avantages de cette approche.

En C# les raisons pour hériter de ApplicationException sont claires: vous obtenez une poignée de méthodes utiles, les propriétés et les constructeurs et juste à ajouter ou de remplacer ce que vous avez besoin. Avec std::exception il semble que tout ce que vous obtenez est un what() méthode pour remplacer la, qui vous pourriez tout aussi bien créer vous-même.

Quels sont donc les avantages, le cas échéant, de l'aide d' std::exception comme une classe de base pour mon application spécifique de la classe d'exception? Existe-il des bonnes raisons de ne pas hériter de la std::exception?

69voto

Nikolai N Fetissov Points 52093

Le principal avantage est que le code à l'aide de vos classes n'est pas nécessaire de connaître le type exact de ce que vous throw ,, mais catch le std::exception.

Edit: comme Martin et d'autres ont fait remarquer, vous souhaitez réellement tirer de l'une des sous-classes de std::exception déclaré en <stdexcept> - tête.

40voto

Loki Astari Points 116129

Le problème avec std::exception c'est qu'il n'y a pas de constructeur (en l'conforme à la norme versions) qui accepte un message.

En conséquence, je préfère dériver de l' std::runtime_error. C'est dérivée de l' std::exception mais ses constructeurs vous permettent de passer d'un C-String ou un std::string pour le constructeur qui sera retournée (en char const*) lors de l' what() est appelé.

17voto

Aleksei Potov Points 829

Raison de l'héritage de std::exception qu'il est "standard" de la classe de base pour les exceptions, il est donc naturel pour les autres personnes sur une équipe, par exemple, de s'attendre à ce que et à la capture de la base std::exception.

Si vous êtes à la recherche pour plus de commodité, vous pouvez hériter std::runtime_error qui fournit std::string constructeur.

12voto

timday Points 14860

Une fois, j'ai participé au nettoyage d'une grande base de code où les auteurs précédents avaient jeté des ints, HRESULTS, std::string, char*, au hasard des classes... des choses différentes partout; juste le nom d'un type et il a probablement été jeté quelque part. Et pas de classe de base commune à tous. Croyez-moi, les choses étaient beaucoup plus propre une fois que nous sommes arrivés au point que tous les jetés types avaient une base commune, nous pourrions attraper et ne savent rien allait se passer. Merci donc de faire vous-même (et ceux qui devrez maintenir votre code dans l'avenir) une faveur et de le faire de cette manière dès le début.

9voto

IfLoop Points 59461

La raison pour laquelle vous pourriez hériter d' std::exception est parce qu'elle permet de lever une exception qui est pris selon la classe, c'est à dire:

class myException : public std::exception { ... };
try {
    ...
    throw myException();
}
catch (std::exception &theException) {
    ...
}

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