2012-01-28 6 views
5

Soy nuevo en php y estoy un poco confundido por el hecho de que no parece haber comunicación de objeto de error entre un método y su llamador.¿Devolver los objetos de error al mal hábito de PHP?

Estos dos son las formas en que aprenden a utilizar:

  1. Si un método no debería información del llamante del error que sólo provoca un error si esto no se E_USER_ERROR que sólo puede devolver FALSE para contar la persona que llama algo salió mal.

  2. Por otro lado, si un método necesita enviar de vuelta alguna información de error a la persona que llama, se debe hacer una excepción.

Viniendo de COCOA He aprendido a usar excepciones en condiciones extraordinarias (errores no recuperables debido a errores del programador). En cualquier otro caso simplemente pase un objeto de error a la persona que llama.

  • ¿Es la filosofía diferente en PHP?
  • ¿Son excepciones el mecanismo estándar para enviar datos de error a la persona que llama?
  • ¿Debo evitar programar mis propios objetos de error y pasarlos como parámetros al método para ser coherente con los patrones de PHP?
+2

Voy a cambiar esto y preguntar "¿Cuándo es preferible devolver un objeto de error en lugar de generar una excepción?". –

Respuesta

8

PHP tiene dos mecanismos principales para la visualización y manejo de errores en el flujo del programa:

Cuál elegir depende de sus preferencias personales. Las excepciones son objetos, por lo que si desea hacer OOP o venir de otro idioma que también usa Excepciones, es posible que desee usarlos. El manejo de errores basado en no excepciones es para todas aquellas notificaciones, advertencias y errores que PHP puede emitir, así como sus propias variantes. Si desea convertir esto en Excepciones, eche un vistazo al ErrorException.

Sin embargo, como ya ha mencionado: las excepciones son para situaciones no recuperables. Son no para gestionar el flujo de control regular. En consecuencia, las Excepciones no son un tipo de mecanismo estándar para enviar mensajes de error a la persona que llama, p. no debe hacer:

class FooValidator 
{ 
    public function isValid($valueToValidate) 
    { 
     if ($this->satisfiesRules($valueToValidate) { 
      return true; 
     } 
     throw new ValidationException('Foo didnt satisfy rule Bar'); 
    } 
} 

y lo intentan/atrapan en la persona que llama. Una validación fallida es una situación recuperable.

Una opción sería la de introducir un Notification Object:

class FooValidator 
{ 
    public function isValid($valueToValidate, Notification $notification) 
    { 
     if ($this->satisfiesRules($valueToValidate) { 
      return true; 
     } 
     $notification->addMessage('Foo didnt satisfy rule Bar'); 
     return false; 
    } 
} 

En el ejemplo anterior, el Validador sólo devuelve un valor booleano, pero puede recoger información adicional acerca de por qué falló la validación en el objeto Notificación pasado.Esto es mucho más limpio que devolver un objeto de error de la llamada, porque no tenemos que verificar el tipo de devolución. Si la validación devuelve falso, sabemos que podemos verificar el objeto de Notificación. Como los objetos se pasan por referencia, no necesitamos devolver el objeto de la llamada, sino simplemente acceder a los mensajes recopilados de la persona que llama.

+0

Me gusta esta respuesta, pero no me ha convencido el argumento de que no debe usar excepciones para el control de flujo. Por qué no? ¿La propagación de excepciones no permite que una función externa en algún nivel se recupere de un error de la manera más adecuada? Casi siempre podemos "recuperarnos" de algo que no esperábamos al devolver un valor predeterminado, pero luego la lógica de evaluar si ese valor devuelto es el resultado de una llamada válida o no se deja a la persona que llama. Una excepción indica claramente que algo está mal y se propaga hasta el controlador más apropiado. Por favor, concédeme –

+1

@ me232 Una excepción indica que algo excepcional ha ocurrido (no solo algo erróneo). Una validación fallida (como en el ejemplo anterior) no es excepcional. No hay ninguna razón para ejecutar esto a través del proceso de manejo de excepciones. También vea http://www.c2.com/cgi/wiki?DontUseExceptionsForFlowControl y http://schlitt.info/opensource/blog/0724_python_good_bad_evil_03_flow_control_exceptions.html – Gordon

+0

Acepto en su ejemplo que el uso de la excepción es bastante inútil, ya que un retorno el valor de falso es probable adecuado de todos modos. La función parece poder recuperarse del problema en sí. Supongamos que tiene un ejemplo más complicado de convertir un objeto en otro. ¿Es incorrecto lanzar una excepción si el argumento no es adecuado para la conversión? ¿Deberían todas las personas que llaman potenciales implementar alguna lógica de validación? –

0

casi todo es posible en PHP, por lo que no hay realmente una mejor manera.

echar un vistazo a excepciones en php.net http://php.net/manual/en/language.exceptions.php

+5

Aprendí dolorosamente que para casi todos los idiomas, casi todo es posible, por eso los patrones de diseño nos hacen la vida más fácil, evitando que reinventemos la rueda y aprendamos de la experiencia ajena. Los documentos oficiales nunca hablan sobre objetos de error, es por eso que pregunto. –

Cuestiones relacionadas