Devrais-je ajouter throw () aux déclarations de mes destructeurs C ++?
-
19-08-2019 - |
Question
J'ai vu des classes C ++ avec un destructeur défini comme suit:
class someClass
{
public:
someClass();
~someClass() throw();
};
Est-ce une bonne idée?
Je suis bien conscient que les destructeurs ne devraient jamais lancer d'exceptions, mais est-ce que cela m'empêchera réellement de lancer des exceptions dans mes destructeurs? Je ne suis pas sûr à 100% de ce que cela garantit.
Référence: cette question récente
La solution
Cela ne vous empêche pas de lancer des exceptions de votre destructeur. Le compilateur vous laissera quand même le faire. La différence est que si vous autorisez une exception à échapper à ce destructeur, votre programme appellera immédiatement inattendu
. Cette fonction appelle le Invisible_handler
auquel le désigne, qui est par défaut terminate
. Donc, à moins que vous ne fassiez quelque chose pour gérer une exception inattendue, votre programme se termine, ce qui n’est pas une mauvaise idée en soi. Après tout, si l’exception est vraiment inattendue, alors votre programme ne pourra rien faire pour le gérer de toute façon.
Ce n'est pas quelque chose de spécial à propos des destructeurs; les mêmes règles s'appliquent aux spécifications d'exception pour toutes les méthodes.
Autres conseils
Ce n'est pas une idée terrible. Si vous lancez le disque alors qu’aucune exception n’est propagée, vous abandonnerez immédiatement, ce qui vous permettra de savoir que vous avez oublié de créer un disque sans lancer.
Si, en revanche, vous ne spécifiez pas les valeurs de projection, vous ne saurez que sur la mauvaise implémentation de votre mauvais développeur quand une exception est levée.