dois-je lancer une exception du constructeur?

46

Je sais que je peux lancer une exception du constructeur en PHP, mais dois-je le faire? Par exemple, si la valeur d'un paramètre n'est pas conforme à mes attentes.

Ou devrais-je différer le lancement d'une exception jusqu'à ce qu'une méthode soit invoquée. Quels sont les avantages et les inconvénients dans les deux cas?

Mots
la source
La question est de savoir si vous voulez que vos utilisateurs voient des messages d’erreur exceptionnels?
15
@ LawrenceCherone non, ce n'est pas la question. Pas du tout. La question est de savoir s'il faut lever une exception immédiatement lorsque le ctor ne peut pas définir l'objet dans un état valide à partir des arguments qui lui sont transmis, ou le différer jusqu'à l'appel d'une méthode opérant sur cette instance avec un état éventuellement non valide. Mieux adapté pour les programmeurs cependant.
4
@ LawrenceCherone Vous avez raison. Aucun logiciel ne devrait jamais délibérément échouer; il faut juste continuer et voir ce qui se passe. / s
user253751
@immibis Un bon sarcasme, c'est bon.
Kodeart
C'est une question géniale !!! Je n'ai même jamais envisagé cette idée jusqu'à aujourd'hui.
Rhys Johns

Réponses:

75

Pourquoi voudriez-vous remettre à plus tard l'exception?

Si vous savez que l'objet ne peut pas instancier correctement avec les paramètres donnés, alors vous devriez certainement lever une exception.

Sinon, quelqu'un pourrait tester votre objet pour null, ce qui ne sera pas le cas, et supposer que tout s'est déroulé comme prévu.

Il y a beaucoup de choses qui peuvent être faites à votre objet sans appeler une méthode dessus: elle pourrait être ajoutée à une liste, elle pourrait être comparée, elle pourrait être envoyée comme paramètre, etc. etc. Toutes ces choses sont cela n'aurait pas dû arriver, considérant que ce n'est pas un objet valide.

Andrei G
la source
21

Si votre constructeur est appelé avec des paramètres incorrects, vous devriez (devez?) Renvoyer une exception. Si vous ne le faites pas, vous pourriez obtenir un mauvais objet qui ne se comportera pas comme prévu.

Félix Gagnon-Grenier
la source
17

Absolument!!

Vous devriez lever l'exception si les paramètres de construction de l'objet ne sont pas valides ou ne sont pas conformes au contrat. Ce n’est pas une bonne idée d’aller de l’avant avec le flux en sachant que l’objet est construit avec des données erronées, ce qui peut poser de nombreux problèmes si vous autorisez l’appelant à poursuivre.

Il vaut toujours mieux "échouer vite et échouer tôt"

java_mouse
la source
7

Je sais que je peux lancer une exception du constructeur en PHP, mais dois-je le faire?

C’est le seul moyen sensé d’informer que la construction de l’objet a échoué.

BЈовић
la source
2

Pourquoi ne pas valider le jeu de paramètres avant d'instancier votre objet? Cela garantirait la création de votre objet, éliminant ainsi les effets secondaires pouvant en résulter.

Bien que je sache que vous pouvez vérifier les choses dans votre constructeur et lancer des exceptions, je préfère écrire mes constructeurs de manière à ce qu'ils n'échouent pas. J'effectue la validation des paramètres avant d'instancier des objets, ce qui me permet de lancer des exceptions sans que mes constructeurs échouent. De plus, je n'essaye généralement pas d'instancier de nouveaux objets dans mes constructeurs, mais plutôt de les instancier au besoin.

Juste mon avis. PHP offre beaucoup de liberté - profitez-en!

Tony Mays
la source
Je ne suis pas sûr de savoir pourquoi cette réponse est refusée. Il fournit une approche valide en utilisant la validation des paramètres avant la construction de l'objet ( une méthode "guard" ), ce qui est un bon moyen de concevoir vos classes / fonctions pour des règles spécifiques (généralement commerciales). Si aussi ne répond pas directement à la question du PO, mais que c'est toujours un bon conseil :)
kodeart