33 votes

Les meilleures pratiques pour définir vos propres classes d'exceptions?

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 ?

26voto

sth Points 91594

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.

6voto

Si. Points 10543

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.

3voto

Mykola Golubyev Points 21210

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.

1voto

Nick Haddad Points 4326

À 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:

  1. Avoir les noms de classe d'exception soit utile et clair.
  2. Documenter clairement (écrire des commentaires) quand une exception sera levée par une méthode ou une méthode de classe. C’est à mon avis le plus gros point de défaillance dans la gestion des exceptions.

1voto

jalf Points 142628

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