web-dev-qa-db-fra.com

Catch catch blocks - intercepter l'exception par valeur ou référence?

Duplicata possible:
intercepter une exception par un pointeur en C++

J'attrape toujours des exceptions par valeur. par exemple

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

Mais je suis tombé sur un code qui avait à la place catch(CustomException &e) à la place. Est-ce a) bien b) mal c) une zone grise?

91
Mr. Boy

La pratique standard pour les exceptions en C++ est ...

Lancer par valeur, attraper par référence

La capture par valeur est problématique face aux hiérarchies d'héritage. Supposons pour votre exemple qu'il existe un autre type MyException qui hérite de CustomException et remplace les éléments comme un code d'erreur. Si un type MyException était jeté, votre bloc catch entraînerait sa conversion en une instance CustomException, ce qui entraînerait la modification du code d'erreur.

135
JaredPar

La capture par valeur tranche l'objet d'exception si l'exception est d'un type dérivé du type que vous interceptez.

Cela peut ou non avoir de l'importance pour la logique de votre bloc catch, mais il n'y a pas de raison de ne pas intercepter par référence const.

Notez que si vous throw; sans paramètre dans un bloc catch, l'exception d'origine est renvoyée, que vous ayez ou non intercepté une copie découpée ou une référence à l'objet exception.

27
CB Bailey

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

9
Marcelo Cantos

dans (CustomException e) un nouvel objet de CustomException est créé ... donc son constructeur sera appelé tandis que dans (CustomException & e) il sera juste la référence ... pas de nouvel objet n'est créé et aucun constructeur ne sera appelé ... donc formel c'est peu frais généraux ... plus tard est préférable d'utiliser ...

2
Mihir Mehta