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?
fuente
Respuestas:
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 .
fuente
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
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.
fuente