Excepciones o códigos de error

12

Estamos construyendo un servicio web (SOAP, .Net) que estaría hablando con (en su mayoría) clientes nativos (Windows, C ++) y nos preguntamos cuál es la mejor manera de comunicarle errores al cliente (por ejemplo, SomethingBadHappened como un servicio de inicio de sesión no disponible) o algo así como el usuario no encontrado) y no he podido decidir entre lanzar una excepción al cliente o usar algún tipo de modelo de código de error para hacer lo anterior.

¿Qué preferiría en el manejo en el lado del cliente: recibir un código de error o manejar una excepción ServerFault que contiene el motivo del error?
1) ¿Por qué estamos pensando en una excepción? Porque haría que el código del lado del servidor fuera mucho más uniforme.
2) ¿Por qué estamos pensando en los códigos de error? Porque creemos que tiene más sentido desde la perspectiva del lado del cliente.

Si 2) es realmente cierto, probablemente querríamos buscar códigos de error que excepciones. ¿Es ese el caso aquí?

Además, ¿cambiaría la respuesta si estuviéramos hablando con clientes administrados en lugar de clientes nativos?

Amit Wadhwa
fuente
Solo para agregar un poco de aclaración: a) Estoy buscando las mejores prácticas aquí y la experiencia del lado del cliente (ya que el cliente es mucho más complicado y preferiríamos manejar las cosas del lado del servidor si podemos mantener el código del cliente más simple) b) El cliente contiene una gran cantidad de código heredado y es posible que podamos o no usar excepciones de C ++.
Amit Wadhwa el
Esto puede ayudar: www.codeproject.com/KB/cpp/cppexceptionsproetcontra.aspx
Gulshan

Respuestas:

8

SOAP tiene un concepto de fallas , puede convertir una excepción en una falla en el lado del servidor y en el proxy del cliente, la falla puede volver a convertirse en una excepción. Esto funciona notablemente bien en WCF y Java metro stack, no puedo comentar sobre clientes nativos de C ++.

Con respecto a las mejores prácticas de SOA, defina una falla genérica y algunas fallas específicas solo si el cliente necesita manejar un cierto tipo de error de manera diferente. Nunca envíe un seguimiento de pila de excepción al cliente en la implementación de producción. Esto se debe a que, en teoría, el rastreo del servidor no tiene significado para el cliente y también por razones de seguridad. Registre el error completo y el stacktrace en el servidor y envíe una referencia única al registro en la falla. En WCF, uso el bloque de manejo de excepciones de Microsoft de Enterprise Library para generar un guid y también convertir una excepción a falla SOAP.

Consulte la guía en Patrones y prácticas de Microsoft .

softveda
fuente
Gracias, esto suena bien. ¿Me puede dar un enlace más específico allí dentro de la página allí?
Amit Wadhwa el
Además ¿qué pasa con errores de nivel de negocio como UserNotFound etc., deben estos también ser manejadas como excepciones
Amit Wadhwa
En proyectos anteriores, nunca usamos Excepciones en el código o Fallos en SOAP para comunicar los modos de falla legítimos / esperados. Usamos códigos de error y los dejamos al cliente para decidir qué hacer con ellos. El usuario no encontrado no es realmente un error / excepción, probablemente debería ser un código de estado.
MrLane
4

Recientemente hice un servicio web con las bibliotecas de Java 6, que puede informar una excepción a la persona que llama (no he investigado cómo se hace automáticamente).

La capacidad de que el cliente proporcione un seguimiento de la pila en el informe de error al desarrollador ha sido muy útil (en lugar de obtener una marca de tiempo aproximada y luego tener que buscarla en sus registros, si es que la registra).

Entonces, visto desde el punto de vista de los desarrolladores, use Excepciones.


fuente
1
Estoy de acuerdo en que esto podría ser útil en dogfood y beta, pero ¿realmente quiere arrojar trazas de pila en registros de eventos o archivos de registro en el uso del mundo real (y, por supuesto, revelar más detalles sobre el servicio de los que necesita / desea en el proceso )
Amit Wadhwa el
2
@Amit, confía en mí en esto: si encuentras una situación que da un seguimiento de la pila en producción, ¡QUIERES el seguimiento de la pila!
1
¿Cuál es el beneficio en el seguimiento de la pila en el lado del cliente? Definitivamente registraremos todas las excepciones en el lado del servidor antes de pasarlo al cliente.
Amit Wadhwa el
Además ¿qué pasa con errores de nivel de negocio como UserNotFound etc., deben estos también ser manejadas como excepciones
Amit Wadhwa
-2

Si se trata de un servicio web, no puede hacer que el servidor arroje una excepción que será detectada por el cliente. En la interfaz, su servidor básicamente tiene que devolver algún tipo de código de error, incluso si es una cadena que dice An exception occurred. Type %s, message %s, stack trace %s.

En cuanto al lado del cliente, puede hacer que su código de lectura de respuesta verifique la respuesta para ver si contiene un error y generar una excepción en el lado del cliente. Esa es una muy buena manera de hacerlo, en idiomas con un buen manejo de excepciones al menos. Sin embargo, C ++ no tiene una buena entrega de excepciones, y es una buena idea mantenerse lo más alejado posible de las excepciones de C ++. Si no puede usar un idioma mejor, entonces siga los códigos de error.

Mason Wheeler
fuente
Supongo que la excepción no detectada iría como ServerFault para el cliente
Amit Wadhwa
3
No hay nada malo con C ++ o excepciones de C ++. Hay muchas razones para usar un lenguaje que no sea C ++ para ciertos proyectos, pero el manejo de excepciones no es una de ellas.
KeithB
No solo eso va en contra de las mejores prácticas de seguridad: ¿Qué debe hacer exactamente el cliente con el seguimiento de la pila de su servidor? ¿Imprimirlo y enviárselo? Enviar como correo electrónico? Uso para papel lubricante?
JensG
@JensG: Si este es un servicio web y no un sitio web , el cliente debe ser lo suficientemente profesional como para enviarlo por correo electrónico como un informe de error.
Mason Wheeler