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