109 votes

Pourquoi intercepter une exception en tant que référence-à-const?

J'ai entendu et lu plusieurs fois qu'il est préférable de capturer une exception en tant que référence-à-const plutôt qu'en tant que référence. Pourquoi est-ce

 try {
    // stuff
} catch (const std::exception& e) {
    // stuff
}
 

mieux que

 try {
    // stuff
} catch (std::exception& e) {
    // stuff
}
 

81voto

Kornel Kisielewicz Points 26556

Vous avez besoin:

  • une référence afin que vous puissiez accéder à l'exception polymorphiquement
  • un const pour augmenter les performances et dire au compilateur que vous n'allez pas modifier l'objet

Ce dernier n’est pas aussi important que le premier, mais la seule raison réelle de laisser const serait de signaler que vous souhaitez modifier l’exception (en général, elle n’est utile que si vous souhaitez la renvoyer avec un contexte ajouté à un niveau supérieur). .

42voto

Il n'y a fondamentalement aucune raison du tout.

Objets d'Exception à vivre dans leur propre espace mémoire si vous n'avez pas à vous inquiéter au sujet de la capture exceptions créées dans des expressions temporaires.

Tout ce que vous faites est la promesse que vous ne modifiez pas l'objet de l'exception, mais depuis l'exception des objets doit avoir un immuable interface, il n'y a vraiment rien de pratique ici.

Toutefois, il pourrait vous faire sentir au chaud et confortable lorsque vous le lire — c'est la façon dont il est pour moi!

Ils ont leur propre, spécial, fil-pile locale.
Avertissement: Coup De Pouce.Exception des pauses afin de faire des trucs funky et ajouter des détails de l'exception, après la construction. Mais c'est hackery!

6voto

Warpin Points 2577

Il indique au compilateur que vous n’appellerez aucune fonction modifiant l’exception, ce qui peut aider à optimiser le code. Cela ne fait probablement pas beaucoup de différence, mais le coût de le faire est également très faible.

2voto

matt Points 1675

allez-vous modifier l'exception? sinon, il peut aussi bien s'agir de const. même raison, vous DEVEZ utiliser const n'importe où ailleurs (je dis: DEVRAIT car cela ne change pas vraiment la surface, cela pourrait aider les compilateurs et aider également les codeurs à utiliser votre code correctement et à ne pas faire des choses qu'ils ne devraient pas faire)

les gestionnaires d'exceptions, peuvent être spécifiques à la plate-forme et peuvent placer des exceptions dans des endroits amusants, car ils ne s'attendent pas à ce qu'ils changent?

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