Maison  >  Article  >  développement back-end  >  Des exceptions doivent-elles être levées de la part des constructeurs ?

Des exceptions doivent-elles être levées de la part des constructeurs ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-10 07:36:02708parcourir

Should Exceptions Be Thrown from Constructors?

Lancement d'exceptions de la part des constructeurs : considérations de conception

Dans le domaine du développement logiciel, le débat persiste concernant l'opportunité de lever des exceptions de la part des constructeurs. Cette question a suscité des discussions parmi les passionnés de programmation, et la récente enquête d'un collègue nous a incité à approfondir le sujet.

Est-il acceptable de lancer des exceptions aux constructeurs du point de vue de la conception ?

Considérons un scénario dans lequel une classe encapsule un mutex POSIX, comme illustré dans l'exemple ci-dessous :

class Mutex {
public:
  Mutex() {
    if (pthread_mutex_init(&mutex_, 0) != 0) {
      throw MutexInitException();
    }
  }
};

Dans ce cas, si l'appel à pthread_mutex_init échoue, l'objet mutex devient inutilisable. Lancer une exception garantit que l'objet n'est pas créé dans un état incohérent, évitant ainsi des erreurs potentielles ultérieurement.

Pratique standard par rapport à l'approche des fonctions membres

On pourrait dire qu'au lieu de lever une exception, la classe pourrait avoir une fonction membre pour l'initialisation qui renvoie un booléen basé sur le résultat de l'appel pthread_mutex_init. Cette approche a ses mérites mais soulève un problème subtil. Cela dépend du fait que chaque utilisateur n'oublie pas d'invoquer la fonction d'initialisation, ce qui peut être négligé et conduire à un comportement indéfini. Cet écart par rapport au principe RAII (Resource Acquisition Is Initialization) peut compromettre la conception prévue de l'objet.

Conclusion

Bien que les deux approches aient leurs avantages, lever des exceptions de la part des constructeurs a est devenue la norme. En échouant tôt, il protège contre la création d'objets incomplets ou incohérents, garantissant que l'état de l'objet est valide avant que d'autres opérations ne soient effectuées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn