92 votes

C++ blocs catch - catch exception par valeur ou par référence?

Double Possible:
exception de catch par pointeur en C++

J'ai toujours attraper les exceptions en valeur. e.g

try{
...
}
catch(CustomException e){
...
}

Mais je suis tombé sur un code qui avait plutôt des catch(CustomException &e) à la place. Est-ce une)b)faux c)une zone grise?

136voto

JaredPar Points 333733

La norme pour les exceptions en C++, c'est ...

Jeter par la valeur prise par référence

Attraper par la valeur est problématique en raison des hiérarchies d'héritage. Supposons, par votre exemple, qu'il existe un autre type MyException qui hérite de l' CustomException et les remplacements des éléments comme un code d'erreur. Si un MyException type a été jeté votre bloc catch serait la cause pour être converti en CustomException de l'instance qui serait la cause de l'erreur de code à modifier.

Références

27voto

Charles Bailey Points 244082

Attraper par la valeur de la tranche de l'objet de l'exception si l'exception est d'un type dérivé le type qui vous attraper.

Cela peut ou peut ne pas question de la logique dans votre bloc catch, mais il y a peu de raison de ne pas l'attraper par référence const.

Notez que si vous throw; sans paramètre dans un bloc catch, à l'exception d'origine est renvoyé si oui ou non vous avez pris une des tranches de copie ou d'une référence à l'objet de l'exception.

9voto

Marcelo Cantos Points 91211

Sauf si vous voulez jouer avec l'exception, vous devez généralement utiliser const référence: catch (const CustomException& e) { ... }. Le compilateur traite de l'objet renvoyé en vie.

2voto

mihir mehta Points 8182

en (CustomException e) nouvel objet de CustomException est créé... il est donc constructeur sera appelé alors que dans (CustomException &e), il sera tout simplement la référence... pas de nouvel objet est créé et aucun constructeur sera appelé... si formel est peu de frais généraux... plus tard est préférable d'utiliser...

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