¿Debo lanzar una excepción del constructor?

46

Sé que puedo lanzar una excepción del constructor en PHP, pero ¿debería hacerlo? Por ejemplo, si el valor de un parámetro no es como lo esperaba.

¿O debería aplazar el lanzamiento de una excepción hasta que se invoque un método? ¿Cuáles son las ventajas y desventajas en ambos casos?

WordsWorth
fuente
la pregunta es ¿desea que sus usuarios vean mensajes de error de excepción feos?
15
@LawrenceCherone no, esa no es la pregunta. De ningún modo. La pregunta es si generar una excepción inmediatamente cuando el ctor no puede establecer el objeto en un estado válido a partir de los argumentos que se le pasan o diferirlo hasta que se llame a un método que opera en esa instancia con un posible estado no válido. Sin embargo, es más adecuado para programadores.
44
@LawrenceCherone Tienes razón. Ningún software debería fallar nunca deliberadamente; debería seguir y ver qué pasa. / s
usuario253751
@immibis El buen sarcasmo es bueno.
kodeart el
¡Esta es una pregunta increíble! Nunca consideré esta idea hasta hoy.
Rhys Johns

Respuestas:

75

¿Por qué posponer lanzar la excepción?

Si sabe que el objeto no puede crear instancias correctamente con los parámetros dados, entonces definitivamente debe lanzar una excepción.

De lo contrario, alguien podría probar su objeto como nulo, lo que no será, y podría asumir que todo salió como se esperaba.

Hay muchas cosas que se pueden hacer a su objeto sin invocar un método: se puede agregar a una lista, se puede comparar, se puede enviar como parámetro, etc., etc. Todas estas son cosas eso no debería haber sucedido, considerando que no es un objeto válido.

Andrei G
fuente
21

Si su constructor se invoca con parámetros incorrectos, entonces debería (¿debe?) Lanzar una excepción. Si no lo hace, podría obtener un objeto malo que no se comportará como se esperaba.

Félix Gagnon-Grenier
fuente
17

¡¡Absolutamente!!

Debe lanzar la excepción si los parámetros para construir el objeto no son válidos o no según el contrato. No es una buena idea seguir adelante con el flujo sabiendo que el objeto está construido con datos incorrectos que pueden causar muchos problemas si permite que la persona que llama continúe.

Siempre es mejor "FALLO RÁPIDO Y FALLO TEMPRANO"

java_mouse
fuente
7

Sé que puedo lanzar una excepción del constructor en PHP, pero ¿debería hacerlo?

Esa es la única forma sensata de informar que la construcción del objeto falló.

BЈовић
fuente
2

¿Por qué no validarías el conjunto de parámetros antes de instanciar tu objeto? Si lo hace, se aseguraría de que su objeto se crearía, eliminando así cualquiera de los efectos secundarios que pueden ocurrir por su falla.

Aunque sé que puede verificar las cosas en su constructor y lanzar excepciones, prefiero escribir mis constructores de tal manera que no fallen. Realizo la validación de parámetros antes de crear instancias de objetos que luego puedo lanzar excepciones sin que mis constructores fallen. Por lo general, tampoco trato de crear instancias de nuevos objetos en mis constructores, sino que prefiero crearlos cuando los necesito.

Solo es mi opinión. PHP ofrece mucha libertad, ¡disfrútalo!

Tony Mays
fuente
No estoy seguro de por qué esta respuesta es rechazada. Proporciona un enfoque válido mediante la validación de parámetros antes de la construcción del objeto ( un método de "guardia" ), que es una buena manera de diseñar sus clases / funciones para reglas específicas (generalmente de negocios). Si tampoco responde directamente a la pregunta del OP, pero sigue siendo un buen consejo :)
kodeart