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?
Réponses
Trop de publicités?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
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.
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...