web-dev-qa-db-fra.com

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

J'ai entendu et lu plusieurs fois, il vaut mieux intercepter une exception comme référence à const plutôt que comme référence. Pourquoi est-ce

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

mieux que

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

Vous avez besoin:

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

Ce dernier n'est pas autant important que le premier, mais la seule vraie raison de supprimer const serait de signaler que vous souhaitez apporter des modifications à l'exception (généralement utile uniquement si vous souhaitez la relancer avec contexte ajouté à un niveau supérieur).

56
Kornel Kisielewicz

Il n'y a fondamentalement aucune raison.

Les objets d'exception vivent dans leur propre espace mémoire vous n'avez donc pas à vous soucier d'attraper les exceptions créées dans les expressions temporaires.

Tout ce que vous faites, c'est promettre que vous ne modifierez pas l'objet d'exception, mais puisque les objets d'exception devraient avoir une interface immuable, il n'y a vraiment rien de pratique ici.

Cependant, cela pourrait vous faire sentir chaud et confortable lorsque vous le lisez - c'est comme ça pour moi!

Ils ont leur propre pile locale de threads.
Disclaimer: Boost.Exception casse cela afin de faire des trucs funky et ajouter des détails d'exception, après la construction. Mais c'est du piratage!

28

Il indique au compilateur que vous n'appelerez aucune fonction qui modifie 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.

5
Warpin

allez-vous modifier l'exception? sinon, il peut tout aussi bien être const. la même raison pour laquelle vous DEVRIEZ utiliser const partout ailleurs (je dis DEVRAIT parce que cela ne fait pas vraiment une grande différence à la surface, pourrait aider les compilateurs, et aussi aider les codeurs à utiliser votre code correctement et à ne pas faire ce 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 parce qu'ils ne s'attendent pas à ce qu'ils changent?

1
matt