try tipos que personalizadas existen excepciones example errores ejemplo custom como catch capturar c# .net exception elmah

c# - tipos - Agregar información adicional a una excepción personalizada



throw custom exception c# (6)

Creé 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.

En excepciones personalizadas como esta, ¿deberían los 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.

Entonces, la pregunta es: - ¿Cómo puedo hacer que Elmah registre información adicional de un campo en una excepción personalizada O - ¿Deben los detalles de excepción adicionales entrar en la propiedad "mensaje"?


Elmah es un módulo http que registra 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.


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.

En general, utilizo el campo de mensaje para proporcionar consejos sencillos y legibles para el ser humano que un programador que no soy yo, al ver este error por primera vez, 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.

Entonces, 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á.


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.


No debe llenar .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 de Message debe describir completamente el error y, cuando sea posible, debe explicar cómo corregirlo. El valor de la propiedad Mensaje se incluye en la información devuelta por ToString.

La propiedad Mensaje se establece solo cuando se crea 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 Mensaje se reemplaza en las clases que requieren control sobre el contenido o el formato del mensaje. 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 ser localizado.

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

Al no estar 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?


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


En excepciones personalizadas como esta, ¿deberían los datos de respuesta adicionales entrar en el "mensaje" de excepción?

No, como ya señaló Sören . 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, eche un vistazo a la implementación de 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 puede ver, agrega el contenido de la propiedad FusionLog , que representa información adicional en caso de fallas en la carga del ensamblaje.

¿Cómo puedo obtener que Elmah registre información adicional de un campo en una excepción personalizada?

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