2008-09-07 16 views
11

He creado una excepción personalizada para un problema muy específico que puede salir mal. Recibo datos de otro sistema y elevo la excepción si se produce una explosión al intentar analizar esos datos. En mi excepción personalizada, agregué un campo llamado "ResponseData", así puedo rastrear exactamente lo que mi código no pudo manejar.Agregar información adicional a una excepción personalizada

En excepciones personalizadas como esta, ¿deberían estos datos de respuesta adicionales entrar en el "mensaje" de excepción? Si va allí, el mensaje podría ser enorme. De alguna manera lo quiero porque estoy usando Elmah, y así es como puedo obtener esos datos.

Así que la pregunta sea: - ¿Cómo puedo obtener Elmah para registrar información adicional de un campo de una excepción personalizada O - En caso de que los detalles adicionales de excepción entrar en la propiedad "mensaje"?

Respuesta

6

No debe completar .Message con información de depuración, sino con un texto conciso y útil.

http://msdn.microsoft.com/en-us/library/system.exception.message.aspx

El texto del mensaje debe describir por completo el error y debe, cuando sea posible, explicar cómo corregirlo. El valor de la propiedad Mensaje se incluye en la información devuelta por ToString.

La propiedad de mensaje se establece solo al crear una excepción. Si no se proporcionó ningún mensaje al constructor para la instancia actual, el sistema proporciona un mensaje predeterminado que se formatea utilizando la cultura del sistema actual.

[..]

Notas para los herederos:

La propiedad de mensaje se reemplaza en las clases que requieren un control sobre el contenido del mensaje o formato. El código de la aplicación generalmente accede a esta propiedad cuando necesita mostrar información sobre una excepción que ha sido capturada.

El mensaje de error debe estar localizado.

Los datos de respuesta no califican como una descripción.

No estoy familiarizado con elmah, no puedo decirte cómo extender la clase Exception mientras lo usas. ¿Elmah implementa su propia subclase a Exception? O una interfaz? ¿Puedes subclasificarlo tú mismo?

0

No entiendo la pregunta: está extendiendo System.Exception y ya ha agregado el campo Elmah. Ahí es donde pertenece, como propiedad pública de la excepción en sí misma.

1

No entiendo completamente la pregunta pero pareces preguntarte qué hacer con los datos de excepción adicionales, si esa no es tu pregunta, no dudes en ignorar esto.

Creo que una pregunta importante es ¿para qué es exactamente el mensaje de excepción? No es para saber de dónde vino la excepción, el seguimiento de la pila es para eso; no es para encapsular una excepción en una más general, eso debe hacerse con el campo InnerException; en el caso en que su excepción solo se plantee desde un lugar particular en su código, ni siquiera se trata de describir qué clase de error tuvo: para qué es el tipo de excepción.

Yo generalmente uso el campo de mensaje para proporcionar consejos simples, fácilmente legible que un programador que no soy yo, viendo este error, por primera vez se puede utilizar para obtener una comprensión del sistema subyacente. Considero que el campo de mensaje es apropiado para una breve explicación (una oración), una sugerencia sobre cómo se genera con frecuencia este error o una referencia para lecturas adicionales.

Por lo tanto, por lo que entiendo su pregunta, creo que la mejor manera de almacenar esta "información adicional" que se recibe de otro sistema es como una InnerException. No conozco a Elmah, pero si vale la pena comprobará InnerExceptions y las almacenará.

0

Elmah es un módulo http que registra las excepciones no controladas.

Supongo que es solo una limitación de Elmah, ya que no almacena campos personalizados. Creo que tendré que preguntarles a esos tipos. Tengo el campo extra allí para los datos de respuesta, pero Elmah no lo almacena.

11

En excepciones personalizadas como este, debe que los datos de respuesta adicionales ir en la excepción "mensaje"?

No, como Sören already pointed out. Sin embargo, su tipo de excepción podría anular ToString y agregar sensiblemente la información de datos de respuesta allí. Esta es una práctica perfectamente normal seguida de muchos de los tipos de excepción en el BCL (Biblioteca de clases base) para que no te encuentres nadando contra la corriente. Por ejemplo, echar un vistazo a la implementación System.IO.FileNotFoundException.ToString en SSCLI (Rotor):

public override String ToString() 
{ 
    String s = GetType().FullName + ": " + Message; 

    if (_fileName != null && _fileName.Length != 0) 
     s += Environment.NewLine + String.Format(Environment.GetResourceString("IO.FileName_Name"), _fileName); 

    if (InnerException != null) 
     s = s + " ---> " + InnerException.ToString(); 

    if (StackTrace != null) 
     s += Environment.NewLine + StackTrace; 

    try 
    { 
     if(FusionLog!=null) 
     { 
      if (s==null) 
       s=" "; 
      s+=Environment.NewLine; 
      s+=Environment.NewLine; 
      s+="Fusion log follows: "; 
      s+=Environment.NewLine; 
      s+=FusionLog; 
     } 
    } 
    catch(SecurityException) 
    { 

    } 
    return s; 
} 

Como se puede ver, se añade el contenido de FusionLog propiedad, que representan información adicional en caso de errores de carga de montaje.

¿Cómo puedo obtener Elmah para grabar información extra de un campo en una costumbre excepción

ELMAH almacena el resultado de llamar ToString en una excepción, ya que los detalles del error por lo que si usted tiene ToString implementado según lo prescrito, la información se registraría sin más trabajo. El único problema es que el detalle registrado será texto no estructurado.

4

La clase de excepción contiene un diccionario (llamado Datos, creo) que puede usar para asociar datos personalizados con una excepción de vanilla.

+0

http://msdn.microsoft.com/en-us/library/system.exception.data(v=vs.110).aspx –

+0

recuerde que si una excepción se serializa, todo lo que contiene debe ser serializable también: así que es bueno extraer solo lo que necesitas si tu objeto es complicado –

Cuestiones relacionadas