Estoy escribiendo una API que se conecta a un servicio que devuelve un simple mensaje de "éxito" o uno de más de 100 diferentes sabores de falla.¿La mejor manera de práctica para indicar que una solicitud del servidor ha fallado?
Originalmente pensé en escribir el método que envía una solicitud a este servicio, de modo que si tuviera éxito el método no devuelve nada, pero si falla por alguna razón, arroja una excepción.
No me importó mucho este diseño, pero por el otro lado hoy estaba leyendo "How to Design a Good API and Why it Matters" de Joshua Bloch, donde dice "Lanzar excepciones para indicar condiciones excepcionales ... No fuerce al cliente a usar excepciones para el flujo de control ". (y "Por el contrario, no fallar en silencio.")
Por otro lado, noté que la HttpWebRequest que estoy usando parece arrojar una excepción cuando la solicitud falla, en lugar de devolver una respuesta que contiene un " Mensaje de 500 Internal Server Error ".
¿Cuál es el mejor patrón para informar errores en este caso? Si lanzo una excepción en cada solicitud fallida, ¿estoy sufriendo un dolor masivo en algún momento en el futuro?
Editar: Muchas gracias por las respuestas hasta ahora. Algunas elaboraciones:
- es una DLL que se les dará a los clientes para que hagan referencia en su aplicación.
- un ejemplo análogo del uso sería
ChargeCreditCard(CreditCardInfo i)
- obviamente, cuando falla el método ChargeCreditCard(), es un gran problema; Simplemente no estoy 100% seguro de si debería detener las prensas o pasarle esa responsabilidad al cliente.
Editar la Segunda: Básicamente no estoy totalmente convencido de cuál de estos dos métodos de empleo:
try {
ChargeCreditCard(cardNumber, expDate, hugeAmountOMoney);
} catch(ChargeFailException e) {
// client handles error depending on type of failure as specified by specific type of exception
}
o
var status = TryChargeCreditCard(cardNumber, expDate, hugeAmountOMoney);
if(!status.wasSuccessful) {
// client handles error depending on type of failure as specified in status
}
por ejemplo, cuando un usuario intenta cargar una tarjeta de crédito, ¿se rechaza realmente la tarjeta como una circunstancia excepcional ? ¿Estoy yendo demasiado lejos en el agujero del conejo al hacer esta pregunta en primer lugar?
"excepciones, excepciones, excepciones!" (* Ballmer dance *) –
¿Esto será RESTO, o JABÓN, o ambos? –
La 'WebException' lanzada por' WebRequest's 'GetResponse()' contiene 'WebResponse' si es _valid_ con respecto al formato de los protocolos. Entonces, para usted, es mantener el diseño de las clases 'BCL' y construir algo similar o ... no. ¿Cuál es el objetivo de tu aplicación? ¿Es esencial que la solicitud del servidor tenga éxito? Entonces tira. ¿O es simplemente bueno tener datos adicionales? – ordag