Tengo un código que está registrando Exception.Message
. Sin embargo, leí un artículo que dice que es mejor usarlo Exception.ToString()
. Con este último, retiene información más crucial sobre el error.
¿Es esto cierto y es seguro continuar y reemplazar todo el registro de código Exception.Message
?
También estoy usando un diseño basado en XML para log4net . ¿Es posible que Exception.ToString()
pueda contener caracteres XML no válidos, lo que puede causar problemas?
Respuestas:
Exception.Message
contiene solo el mensaje (doh) asociado con la excepción. Ejemplo:El
Exception.ToString()
método dará un resultado mucho más detallado, que contiene el tipo de excepción, el mensaje (de antes), un seguimiento de la pila y todas estas cosas nuevamente para excepciones anidadas / internas. Más precisamente, el método devuelve lo siguiente:fuente
Además de lo que ya se ha dicho, no lo use
ToString()
en el objeto de excepción para mostrarlo al usuario. Solo laMessage
propiedad debería ser suficiente, o un mensaje personalizado de nivel superior.En términos de fines de registro, definitivamente use
ToString()
en la Excepción, no solo en laMessage
propiedad, ya que en la mayoría de los escenarios, se quedará rascándose la cabeza donde ocurrió específicamente esta excepción y cuál fue la pila de llamadas. El stacktrace te hubiera dicho todo eso.fuente
Convertir toda la excepción a una cadena
Llamar
Exception.ToString()
le brinda más información que simplemente usar laException.Message
propiedad. Sin embargo, incluso esto todavía deja mucha información, que incluye:Data
propiedad de colección se encuentra en todas las excepciones.Hay momentos en los que desea capturar esta información adicional. El siguiente código maneja los escenarios anteriores. También escribe las propiedades de las excepciones en un orden agradable. Está utilizando C # 7, pero debería ser muy fácil para usted convertir a versiones anteriores si es necesario. Ver también esta respuesta relacionada.
Sugerencia: excepciones de registro
La mayoría de las personas usarán este código para iniciar sesión. Considere usar Serilog con mi paquete Serilog.Exceptions NuGet que también registra todas las propiedades de una excepción pero lo hace más rápido y sin reflejos en la mayoría de los casos. Serilog es un marco de registro muy avanzado que está de moda en el momento de la escritura.
Sugerencia: trazas de pila legible para humanos
Puede usar el paquete NuGet de Ben.Demystifier para obtener rastros de pila legibles por humanos para sus excepciones o el paquete NuGet serilog-enrichers- desmystify si está usando Serilog.
fuente
Yo diría que @Wim tiene razón. Debe usarlo
ToString()
para los archivos de registro, suponiendo una audiencia técnica, yMessage
, si es que lo hace, para mostrarlo al usuario. Se podría argumentar que incluso eso no es adecuado para un usuario, para cada tipo de excepción y ocurrencia (piense en ArgumentExceptions, etc.).Además, además de StackTrace,
ToString()
incluirá información que no obtendrá de otra manera. Por ejemplo, la salida de fusión, si está habilitada para incluir mensajes de registro en "mensajes" de excepción.Algunos tipos de excepciones incluso incluyen información adicional (por ejemplo, de propiedades personalizadas) en
ToString()
, pero no en el Mensaje.fuente
Depende de la información que necesite. Para depurar, el seguimiento de la pila y la excepción interna son útiles:
fuente
Exception.ToString()
te dará, ¿verdad?StringBuilder
en este escenario puede ser más costoso que dos nuevas asignaciones de cadenas, es muy discutible que sería más eficiente aquí. No es como si estuviéramos lidiando con iteraciones. Caballos de carreras.En términos del formato XML para log4net, no necesita preocuparse por ej. ToString () para los registros. Simplemente pase el objeto de excepción en sí mismo y log4net hace el resto para darle todos los detalles en su formato XML preconfigurado. Lo único con lo que me encuentro en ocasiones es el nuevo formato de línea, pero es cuando estoy leyendo los archivos sin formato. De lo contrario, analizar el XML funciona muy bien.
fuente
Bueno, yo diría que depende de lo que quieras ver en los registros, ¿no? Si está satisfecho con lo que proporciona el mensaje, utilícelo. De lo contrario, use ex.toString () o incluso registre el seguimiento de la pila.
fuente