2011-05-08 41 views
99

¿Cuál es la manera correcta de mostrar mi completo InnerException.¿Cuál es la forma correcta de mostrar la InnerException completa?

Encontré que algunas de mis InnerExceptions tienen otro InnerException y que van bastante profundo.

Will InnerException.ToString() hacer el trabajo para mí o tengo que colocar a través de la InnerExceptions y construir una String con StringBuilder?

+0

¿Por qué necesita mostrar la excepción interna? –

+19

@Akram porque la mayoría de las veces es la excepción interna lo que es interesante. Un ejemplo es el XmlSerializer que lanza una InvalidOperationException cada vez que algo sale mal. Lo que salió mal está en la excepción interna. – adrianm

+3

@AkramShahda Bueno, ¿tal vez quiera utilizar este método en su registro? – cederlof

Respuesta

163

Simplemente puede imprimir exception.ToString() - que también incluirá el texto completo de todas las InnerException s anidadas.

+5

Esto incluye una carga de otras porquerías, no solo el mensaje de excepción y los mensajes de excepción internos –

+0

, solo por claridad, en realidad no necesita el .ToString(), solo con la excepción hará lo mismo. –

34

sólo tiene que utilizar exception.ToString()

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

La implementación predeterminada de ToString obtiene el nombre de la clase que lanzó la excepción actual, el mensaje, el resultado de llamar ToString en la excepción interna y el resultado de llamar a Environment.StackTrace. Si alguno de estos miembros es nulo, su valor no se incluye en la cadena devuelta.

Si no hay un mensaje de error o si es una cadena vacía (""), no se devuelve ningún mensaje de error. El nombre de la excepción interna y el seguimiento de pila se devuelven solo si no son nulos.

exception.ToString() también llamará .ToString() en la excepción interna de esa excepción, y así sucesivamente ...

31

que suelo hacer como esto para eliminar la mayor parte del ruido:

void LogException(Exception error) { 
    Exception realerror = error; 
    while (realerror.InnerException != null) 
     realerror = realerror.InnerException; 

    Console.WriteLine(realerror.ToString()) 
}  
20

@ La respuesta de Jon es la mejor solución cuando se desea obtener todos los detalles (todos los mensajes y el seguimiento de la pila) y la recomendada.

Sin embargo, puede haber casos en los que sólo quieren los mensajes internos, y para estos casos utilizo el siguiente método de extensión:

public static class ExceptionExtensions 
{ 
    public static string GetFullMessage(this Exception ex) 
    { 
     return ex.InnerException == null 
      ? ex.Message 
      : ex.Message + " --> " + ex.InnerException.GetFullMessage(); 
    } 
} 

a menudo utilizar este método cuando tenga diferentes oyentes de seguimiento y registro y quiero tener diferentes puntos de vista sobre ellos. De esta forma puedo tener un oyente que envía el error completo con seguimiento de pila por correo electrónico al equipo de desarrollo para la depuración usando el método .ToString() 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 método .GetFullMessage().

+1

FYI Si 'ex' es una' AggregateException', ninguna de las excepciones internas se incluirá en esta salida – kornman00

Cuestiones relacionadas