J'ai quelques cas exceptionnels que je veux lancer et attraper, alors je veux définir mes propres classes d'exceptions.
Quelles sont les meilleures pratiques pour cela? Devrais-je hériter de std::exception
ou std::runtime_error
?
J'ai quelques cas exceptionnels que je veux lancer et attraper, alors je veux définir mes propres classes d'exceptions.
Quelles sont les meilleures pratiques pour cela? Devrais-je hériter de std::exception
ou std::runtime_error
?
Oui, c'est une bonne pratique pour hériter de std::runtime_error
ou les autres classes d'exception comme std::logic_error
, std::invalid_argument
et ainsi de suite, selon le type de l'exception qu'il est.
Si toutes les exceptions héritent d'une certaine façon de std::exception
il est facile de rattraper toutes les erreurs courantes par un catch(const std::exception &e) {...}
. Si vous avez plusieurs indépendante des hiérarchies cela devient plus compliqué. Découlant de l'spécialisés des classes d'exception qui rend ces exceptions portent plus d'informations, mais l'utilité de cette fonction est vraiment dépend de la façon dont vous faites votre gestion des exceptions.
Je ne suis pas un développeur C ++, mais l'une des choses que nous avons effectuées dans notre code C # a été de créer une exception de classe de base pour notre framework, puis de consigner l'exception levée dans le constructeur:
public FrameworkException(string message, Exception innerException)
: base(message, innerException)
{
log.Error(message, innerException);
}
...
Toute exception dérivée doit simplement appeler son constructeur de base et nous obtenons une journalisation des exceptions cohérente. Pas très grave, mais utile.
C'est un bien quand une exception est placée dans une certaine portée. Par exemple, la classe Manipulation peut déclarer à l'intérieur des classes d'exception Error.
et les attraper comme
catch ( const Manipulation::InputError& error )
catch ( const Manipulation::CalculationError& error )
Dans de tels cas, il peut s'agir simplement de classes vides sans aucune information d'erreur supplémentaire, à moins que votre conception ne permette à ces exceptions de voler beaucoup plus haut lorsque vous interceptez toutes les exceptions standard.
À mon avis, peu importe si vous héritez de std :: exception ou non. Pour moi, la chose la plus importante dans la définition des exceptions est la suivante:
Cela ne fait pas grande différence, puisque std::runtime_error
hérite également de std::exception
. Vous pourriez faire valoir que l'erreur d'exécution véhicule davantage d'informations sur l'exception, mais dans la pratique, les utilisateurs dérivent souvent simplement de la classe d'exception de base.
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.