todas tipos salida propagacion programacion las jerarquia excepciones errores entrada java design http exception

tipos - ¿Qué clase de excepción de Java usar para los errores de HTTP?



tipos de excepciones en programacion (5)

Estoy usando Apache HttpClient y me gustaría comunicar los errores HTTP (400 Bad Request, 404 Not Found, 500 Server Error, etc.) a través del mecanismo de excepción de Java al código de llamada. ¿Existe una excepción en la biblioteca estándar de Java o en una biblioteca ampliamente utilizada que sería apropiada para usar o para crear una subclase para este fin?

La alternativa es verificar los códigos de retorno de estado. Esta parece ser la filosofía de diseño de HttpClient, pero dado que estos errores son realmente excepcionales en mi aplicación, me gustaría tener el seguimiento de la pila y otras cosas buenas de excepción configuradas para mí cuando ocurran.


Respuesta rápida

En Spring tienes exactamente lo que quieres:

Y una práctica recomendada

Como mínimo, debe diferenciar las excepciones relacionadas con la lógica comercial (p. Ej., Saldo insuficiente, la dirección de correo electrónico no es válida) de otras excepciones (p. Ej., Servidor no disponible, tipo de medio no compatible, SQLException).

En nuestra API REST, tenemos una biblioteca para clientes Java que analiza las respuestas y arroja solo tres excepciones diferentes:

  • 400, 401, 403, 404, 409 : arroje MyBusinessException , que contiene un mensaje que se puede mostrar al usuario final. El mensaje viene en el cuerpo de respuesta (manejo de excepciones en el lado del servicio), pero si no está presente, tenemos un mensaje predeterminado específico para cada código de estado.
  • 405, 412, 415 : arroje HttpClientErrorException con un mensaje que sea específico para cada código de estado.
  • otros códigos 4xx : lanzar HttpClientErrorException con un mensaje genérico.
  • Códigos 5xx : lanzar HttpServerErrorException con un mensaje genérico.

Todas estas excepciones no están marcadas.



Hay org.apache.commons.httpclient.HttpException si desea una excepción de biblioteca. A veces también hemos creado el nuestro para fines específicos, creando una excepción para códigos de estado HTTP específicos y uno genérico para un código de estado inesperado.


Si no es una excepción en la filosofía de diseño de HttpClient, sino una excepción en su código, cree sus propias clases de excepción. (Como una subclase de org.apache.commons.httpclient.HttpException)


Yo diría que esto depende de para qué estés usando HTTPClient. Por ejemplo, el SDK de PayPal utiliza HttpClient para transmitir llamadas API al servidor de PayPal, pero no comprueba el código de respuesta HTTP cuando está hecho. Parcheé mi copia para que, si el código de respuesta no es 200, arroje una FatalException de PayPal, con un mensaje apropiado. Esto se debe a que la persona que llama no está interesada en el HTML ni en ninguno de los detalles de esta publicación HTTP, y ni siquiera está interesada en el hecho de que estamos utilizando HTTP como medio de transporte. Si la llamada es exitosa, el cuerpo de la respuesta contiene detalles de la transacción, que se extraen y se colocan en un objeto de respuesta; de lo contrario, contiene HTML, que es inútil. HTTP es solo el transporte en este caso, por lo que ciertos códigos de respuesta indican errores que se pueden informar utilizando excepciones. Como esto es parte del SDK de PayPal, utilicé una clase de Excepción de PayPal. En otro sistema o biblioteca, usaría un subtipo de excepciones que la biblioteca ya utiliza. Por ejemplo, si estuviera escribiendo una biblioteca de GMail, que accede a las cuentas de GMail, probablemente crearía una clase de GMailException y una subclase para los diferentes tipos de excepciones con los que se topa la biblioteca. Alternativamente, puede usar algo como IOException .

La razón por la que HttpClient lo hace verificar los códigos de respuesta es porque la respuesta puede ser útil incluso si el código de respuesta no es 200. Algunos sitios web ponen texto útil en una página 404, ya sea proporcionando algo útil para el usuario o un formulario de búsqueda, o solo un mensaje de error útil. Dependiendo de su caso de uso, puede mostrar el contenido de la respuesta en lugar de arrojar una excepción.