Duplication possible:
attraper une exception par un pointeur en C ++
Je prends toujours les exceptions par valeur. par exemple
try{ ... } catch(CustomException e){ ... }
Mais je suis tombé sur un code qui à la place avait catch(CustomException &e)
place. Est-ce que c’est une amende b) une erreur c) une zone grise?
La pratique standard pour les exceptions en C ++ est …
Jeter par valeur, attraper par référence
Attraper par valeur pose problème face aux hiérarchies d’inheritance. Supposons, pour votre exemple, qu’il existe un autre type MyException
qui hérite de CustomException
et remplace des éléments tels qu’un code d’erreur. Si un type MyException
était MyException
votre bloc catch le convertirait en une instance CustomException
, ce qui entraînerait la modification du code d’erreur.
Attraper par valeur divisera l’object exception si l’exception est d’un type dérivé du type que vous attrapez.
Cela peut ou peut ne pas être important pour la logique de votre bloc catch, mais il y a peu de raisons 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 saisi une copie en tranches ou une référence à l’object exception.
Sauf si vous voulez manipuler 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’object lancé.
dans (CustomException e)
nouvel object de CustomException est créé … donc son constructeur sera appelé pendant que (CustomException & e) il sera juste la référence … pas de nouvel object est créé et aucun constructeur ne sera appelé … si formel est un peu overhead … plus tard vaut mieux utiliser …