¿Cuál es la forma correcta de mostrar mi plenitud InnerException
?
Descubrí que algunas de mis InnerExceptions tienen otra InnerException
y eso es bastante profundo.
¿Haré InnerException.ToString()
el trabajo por mí o necesito recorrer InnerExceptions
y construir un String
con StringBuilder
?
c#
exception
inner-exception
Willem
fuente
fuente
Respuestas:
Simplemente puede imprimir
exception.ToString()
, eso también incluirá el texto completo de todos los correosInnerException
electrónicos anidados .fuente
ToString
métodos personalizados para excepciones internas como se detalla en ¿Por qué System.Exception.ToString no llama a ToString virtual para excepciones internas? .Solo usa
exception.ToString()
http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx
exception.ToString () también llamará a .ToString () en la excepción interna de esa excepción, y así sucesivamente ...
fuente
Por lo general, me gusta esto para eliminar la mayor parte del ruido:
Editar: Olvidé esta respuesta y me sorprende que nadie haya señalado que solo puedes hacer
fuente
error.GetBaseException()
? Creo que esto hace lo mismo ...La respuesta de @ Jon es la mejor solución cuando desea detalles completos (todos los mensajes y el seguimiento de la pila) y la recomendada.
Sin embargo, puede haber casos en los que solo desee los mensajes internos, y para estos casos uso el siguiente método de extensión:
A menudo uso este método cuando tengo diferentes oyentes para rastrear y registrar y quiero tener diferentes puntos de vista sobre ellos. De esa manera, puedo tener un oyente que envía el error completo con el seguimiento de la pila por correo electrónico al equipo de desarrollo para la depuración utilizando el
.ToString()
método y uno que escribe un archivo de inicio de sesión con el historial de todos los errores que ocurrieron cada día sin el seguimiento de la pila con El.GetFullMessage()
métodofuente
ex
es unAggregateException
, ninguna de las excepciones internas se incluirá en esta salidaPara imprimir solo la
Message
parte de excepciones profundas, puede hacer algo como esto:Esto atraviesa recursivamente todas las excepciones internas (incluido el caso de
AggregateException
s) para imprimir todas lasMessage
propiedades contenidas en ellas, delimitadas por el salto de línea.P.ej
Necesitará escuchar otras propiedades de Excepción para más detalles. Por ejemplo
Data
tendrá alguna información. Podrías hacerlo:Para obtener todas las propiedades derivadas (no en la
Exception
clase base ), puede hacer:fuente
IEnumerable<Exception>
lugar de una codificación rígidaAggregrateException
para manejar otros tipos similares. También excluirp.IsSpecialName
ypi.GetIndexParameters().Length != 0
evitar problemas. Incluir el nombre del tipo de excepción en la salida también es una buena ideaHago:
Esto "imprime" todas las excepciones internas y también maneja AggregateExceptions y casos donde InnerException.Message es lo mismo que Message
fuente
Si desea información sobre todas las excepciones, use
exception.ToString()
. Recopilará datos de todas las excepciones internas.Si solo quieres la excepción original, úsala
exception.GetBaseException().ToString()
. Esto le dará la primera excepción, por ejemplo, la excepción interna más profunda o la excepción actual si no hay una excepción interna.Ejemplo:
fuente
acumulación de la respuesta de nawfal.
cuando usé su respuesta faltaba una variable aggrEx, la agregué.
archivo ExceptionExtenstions.class:
fuente
e.StackTrace == null