2011-05-18 11 views
8

Estoy trabajando en una clase de contenedor API, que es la primera que he hecho. En su mayor parte, no ha sido demasiado difícil. Llegando al punto en el que tengo que lidiar con el potencial de los errores que devuelve la API, sin embargo, confundido en cuanto a cómo debo tratar con ellos.¿Cuándo debería lanzar una excepción en lugar de devolver un error en PHP?

un archivo externo hará una llamada a la API clase, es decir, findVenueByLocationID($locationID); Esta función se va a crear la dirección URL y el método de llamada a la API (POST, GET, DELETE, etc.) y pasar eso a una función llamada makeCall.

MakeCall construye la URL completa, envía la solicitud al servicio y devuelve el XML resultante. Si la API devuelve un error, está dentro del XML que devuelve. La URL se llama utilizando la función file_get_contents(). La API tiene un número establecido de códigos de error que devolverá en el XML.

Como yo lo entiendo, yo debería hacer lo siguiente durante la función makeCall:

  • Antes se devuelve el XML, comprobar para ver si contiene un código de error, y si es así, sucedió que a un error manejando la clase para lidiar con el error. (Inicie sesión y devuelva el mensaje de error de la versión del cliente)
  • agregue un intento de capturar la función file_get_contents() para detectar los errores de conexión, es decir, no poder acceder al servidor?

¿Se considera esta la mejor manera de hacer las cosas? ¿Debo agregar una captura de prueba en la llamada a makeCall en lugar de dentro de file_get_contents? ¿Debo lanzar una excepción para cada error devuelto por el XML y manejarlos con una clase de error?

El tipo de respuesta que estoy buscando también debe contener un enlace a un recurso que explique algunas de las mejores prácticas relacionadas con el manejo de errores con envoltorios de API o cosas por el estilo.

Gracias de antemano por su tiempo y respuestas.


EDIT: Después de hablar con nuestro director de tecnología, los errores en PHP a la versión actual de excepciones, y que debería lanzar excepciones y dejar el reparto de las excepciones a la persona que llama. Recuerde, estoy implementando una clase contenedora para una API. ¿Pensamientos?

+0

'file_get_contents()' desencadena advertencias si no puede recuperar o leer el recurso, por lo que un try ... catch no lo ayudará. Si usa una clase como 'Zend_Http_Client', podrá interceptar fallas más fácilmente. –

Respuesta

3

Primero debe saber la diferencia entre excepciones y errores: se producen errores, las excepciones son excepcionales.

Por ejemplo, un usuario que escribe una contraseña incorrecta (no puede iniciar sesión) obtiene un error. Cuando la base de datos no esté disponible mientras se verifica la contraseña, se obtendría una excepción (y, con suerte, un manejo ágil de esa excepción).

Así que si obtiene XML de un tercero, probablemente esperaría que fuera válido. Pero podría haber errores. Si la API le da un error (ubicación no encontrada), probablemente también sea un error de su parte. Solo en casos especiales (has codificado una ubicación que sabes con certeza siempre estará allí) que podría ser una excepción.

Las excepciones más triviales son los errores de conexión: definitivamente hay algo mal entonces. La otra cosa fácil son los errores en la API que podría esperar, como "sin información nueva" (solo como un ejemplo): este es un error interno.Y en algún lugar debe trazar una línea, pero en la mayoría de los casos es algo claro lo que es excepcional y lo que es solo un error que puede ocurrir.

+0

Gracias por su opinión sobre esto. Parece que nuestra unidad se perdió algo de información esencial ... ¿Podría explicarse mejor como un error cuando el procesamiento de datos tiene un problema y una excepción es cuando el proceso no puede completarse? – Relequestual

+0

Esa sería una variante muy utilizada, supongo y probablemente utilizable en este caso, pero tenga en cuenta que no hay soluciones "reales" y absolutas, solo pautas por situación. Por ejemplo, si tiene una situación (conexión mala conocida, tal vez incluso está probando la conexión) donde no se espera que un proceso se complete, puede llamar a eso un error. Entonces, en ese caso, su conexión arroja una excepción (porque para la conexión es extraño: no puede hacer lo que debería), pero la capta y devuelve un error en su programa de prueba. – Nanne

Cuestiones relacionadas