2009-07-10 25 views
5

A raíz de una pregunta here me hizo pensar ....Al pasar un objeto de excepción a un servicio web

Would it/es posible que cuando una aplicación se encuentra con una excepción no controlada para este objeto excepción a ser serializado y enviado a un servicio web con un backend db. Entonces, usando una utilidad o incluso dentro de Visual Studio, ¿el objeto de excepción podría cargarse desde el DB e inspeccionarse?

¿Sería esto posible? Supongo que la primera pregunta es si puedes serializar objetos de excepción.

Respuesta

-1

No es necesario. Solo registre la excepción.

Si desea iniciar sesión en una base de datos, continúe. Puede usar el Bloque de aplicaciones de registro de la biblioteca empresarial para esto.

+0

Sí, puede registrar la excepción en el disco, pero eso no es muy útil para un desarrollador cuando no tiene acceso a la máquina donde ocurrió la excepción. La idea es 1) Informar al desarrollador que ocurrió un error y 2) Darles tanta información que les permita rastrear el problema en lugar de recibir un correo electrónico que diga "Tu aplicación simplemente se colgó" – Calanus

+0

Dije que puedes iniciar sesión en una base de datos El bloque de registro puede hacer eso. –

+2

Sí, pero solo puede iniciar sesión en la base de datos si tiene acceso directo a la base de datos en cuestión, que puede no ser siempre el caso – Calanus

3

Puede serializar objetos de excepción. Esto es, de hecho, necesario para transportar un objeto de excepción desde el servidor al cliente, en el caso de una excepción lanzada en una llamada de servicio web. Es por eso que System.Exception tiene un constructor overload that creates an exception object from serialized data.

Ejemplo de código para serializar/deserializar objeto de excepción:

private static void SerializeException(Exception ex, Stream stream) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    formatter.Serialize(stream, ex); 
} 

private static Exception DeserializeException(Stream stream) 
{ 
    BinaryFormatter formatter = new BinaryFormatter(); 
    return (Exception)formatter.Deserialize(stream); 
} 

// demo code 
using (Stream memoryStream = new MemoryStream()) 
{ 
    try 
    { 
     throw new NullReferenceException(); 
    } 
    catch (Exception ex) 
    { 
     // serialize exception object to stream 
     SerializeException(ex, memoryStream); 
     memoryStream.Position = 0; 
    } 
    // create exception object from stream, and print details to the console 
    Console.WriteLine(DeserializeException(memoryStream).ToString()); 
} 

Dicho esto, yo probablemente conformarse con ingresar el tipo de excepción, el mensaje y Seguimiento de la pila en algún lugar para que pueda examinar la información.

+0

Serializar, sí. XML Serialize, no tan bien. –

0

Sí, es posible, en el caso de que su software esté en un sitio remoto, puede iniciar sesión localmente y volver periódicamente a la "nave nodriza", a través de su servicio web.

Es una forma bastante efectiva de recopilar información sobre excepción no controlada en la naturaleza y resolverla.

Si recopila el seguimiento de la pila, generalmente es lo suficientemente bueno como para darle una pista de dónde está el problema. Sin embargo, en las compilaciones de lanzamiento no obtendrá ningún número de línea.

1

Usando WCF, esta sería una tarea fácil. Implemente un IErrorHandler personalizado para enviar errores a un servicio de registro. La clase FaultException<TDetail> es utilizada por WCF para informar errores en un formato XML SOAP y se puede enviar directamente al servicio de registro.

1

Bueno, hay varias maneras de abordar esto. En el pasado, he hecho simplemente lo que yo llamaría una serialización XML super-ingenua, que ammounted a algo así como

<exception> 
    <type></type> 
    <Message></Message> 
    <StackTrace></StackTrace> 
    <innerException></innerException> //this would have the same schema as the root exception 
</exception 

y simplemente pasar eso. No necesitaba deserializarlo por lo que estaba haciendo. Simplemente estaba registrando la parte técnica y mostrando el mensaje al usuario cuando el servicio web falló.

Otra opción es simplemente hacer una serialización binaria a una tabla db, pasar la clave a esa tabla por el cable, y rehidratar la excepción del binario de la base de datos.

Cuestiones relacionadas