devo lançar exceção do construtor?

46

Eu sei que posso lançar exceção do construtor em PHP, mas devo fazê-lo? Por exemplo, se o valor de um parâmetro não for o esperado.

Ou devo adiar o lançamento de uma exceção até que um método seja chamado. Quais são as vantagens e desvantagens de ambos os casos?

WordsWorth
fonte
a pergunta é: você deseja que seus usuários vejam mensagens de erro de exceção feias?
15
@LawrenceCherone não, essa não é a questão. De modo nenhum. A questão é se deve ser lançada uma exceção imediatamente quando o ctor não pode definir o objeto em um estado válido a partir dos argumentos passados ​​a ele ou adiar isso até que um método que opere nessa instância com possível estado inválido seja chamado. Mais adequado para programadores.
4
@LawrenceCherone Você está certo. Nenhum software deve falhar deliberadamente; deve apenas continuar e ver o que acontece. / s
user253751
@immibis Bom sarcasmo é bom.
precisa saber é
Esta é uma pergunta incrível !!! Eu nunca considerei essa idéia até hoje.
Rhys Johns

Respostas:

75

Por que você adiaria lançar a exceção?

Se você sabe que o objeto não pode instanciar adequadamente com os parâmetros fornecidos, você definitivamente deve lançar uma exceção.

Caso contrário, alguém pode testar seu objeto como nulo, o que não será, e pode assumir que tudo correu conforme o esperado.

Há muitas coisas que podem ser feitas no seu objeto sem a necessidade de chamar um método: ele pode ser adicionado a uma lista, comparável, enviado como parâmetro, etc, etc. etc. isso não deveria ter acontecido, considerando que não é um objeto válido.

Andrei G
fonte
21

Se seu construtor for chamado com parâmetros ruins, você deve (deve?) Lançar uma exceção. Caso contrário, você poderá obter um objeto ruim que não se comportará conforme o esperado.

Félix Gagnon-Grenier
fonte
17

Absolutamente!!

Você deve lançar a exceção se os parâmetros para a construção do objeto não forem válidos ou não conforme o contrato. Não é uma boa idéia prosseguir com o fluxo, sabendo que o objeto é construído com dados incorretos, o que pode causar muitos problemas se você permitir que o chamador prossiga.

É sempre melhor "FALAR RÁPIDO E FALHAR ANTES"

java_mouse
fonte
7

Eu sei que posso lançar exceção do construtor em PHP, mas devo fazê-lo?

Essa é a única maneira sensata de informar que a construção do objeto falhou.

BЈовић
fonte
2

Por que você não validaria o conjunto de parâmetros antes de instanciar seu objeto? Fazer isso garantiria que seu objeto fosse criado, removendo assim qualquer um dos efeitos colaterais que possam ocorrer devido a sua falha.

Embora eu saiba que você pode verificar as coisas em seu construtor e lançar exceções, prefiro escrever meus construtores de tal maneira que eles não falhem. Realizo a validação de parâmetros antes de instanciar objetos, para que eu possa lançar exceções sem que meus construtores falhem. Eu também geralmente não tento instanciar novos objetos em meus construtores, optando por instancia-los conforme necessário.

Apenas minha opinião. PHP oferece muita liberdade - divirta-se!

Tony Mays
fonte
Não sei ao certo por que esta resposta foi reduzida. Ele fornece uma abordagem válida usando a validação de parâmetro antes da construção do objeto ( um método "guard" ), que é uma boa maneira de projetar suas classes / funções para regras específicas (geralmente comerciais). Se também não responder diretamente à pergunta do OP, mas ainda é um conselho bom :)
kodeart