2010-11-24 33 views
70

Por ejemplo, en un solo lugar ...¿Cómo imprimir el seguimiento completo de pila en la excepción?

//---------------a 
try 
{ 
    // some network call 
} 
catch(WebException we) 
{ 
    throw new MyCustomException("some message ....", we); 
} 

... y en otro lugar ...

//--------------b 
try 
{ 
    // invoke code above 
} 
catch(MyCustomException we) 
{ 
    Debug.Writeline(we.stacktrace); // <---------------- 
} 

El StackTrace imprimo, sólo se inicia de A a B, que no incluye el stacktrace interior de la WebException.

¿Cómo puedo imprimir todo el stacktrace ???

+0

Tenga en cuenta que stacktrace para la WebException de origen no se imprimirá porque ha lanzado una nueva excepción en lugar de volver a lanzar la WebException. Use 'throw;' en lugar de 'throw new MyCustomException (...)' si desea conservar (y generar) la pila de excepción original. – Beel

Respuesta

121

que suelen utilizar el método ToString() sobre las excepciones para presentar la información de excepción completo (incluyendo el seguimiento de pila interno) en el texto:

catch (MyCustomException ex) 
{ 
    Debug.Writeline(ex.ToString()); 
} 

Resultado de muestra:

ConsoleApplication1.MyCustomException: some message .... ---> System.Exception: Oh noes! 
    at ConsoleApplication1.SomeObject.OtherMethod() in C:\ConsoleApplication1\SomeObject.cs:line 24 
    at ConsoleApplication1.SomeObject..ctor() in C:\ConsoleApplication1\SomeObject.cs:line 14 
    --- End of inner exception stack trace --- 
    at ConsoleApplication1.SomeObject..ctor() in C:\ConsoleApplication1\SomeObject.cs:line 18 
    at ConsoleApplication1.Program.DoSomething() in C:\ConsoleApplication1\Program.cs:line 23 
    at ConsoleApplication1.Program.Main(String[] args) in C:\ConsoleApplication1\Program.cs:line 13 
+0

Muy bien. Estaba buscando una forma simple de hacerlo y aquí está. Una pequeña preocupación es que no es tan explícito como si usara el objeto exception.StackTrace (por ejemplo). Me pregunto si hay una forma más explícita de hacer lo mismo. – codea

+3

Tenga en cuenta que algunas bibliotecas anulan el método 'ToString' e imprimen mensajes personalizados en lugar de la información completa (esta es una mala práctica de codificación, así que ** no ** haga eso, nunca) – Dinei

42

utilizar una función como esta:

public static string FlattenException(Exception exception) 
    { 
     var stringBuilder = new StringBuilder(); 

     while (exception != null) 
     { 
      stringBuilder.AppendLine(exception.Message); 
      stringBuilder.AppendLine(exception.StackTrace); 

      exception = exception.InnerException; 
     } 

     return stringBuilder.ToString(); 
    } 

Entonces se le puede llamar así:

try 
{ 
    // invoke code above 
} 
catch(MyCustomException we) 
{ 
    Debug.Writeline(FlattenException(we)); 
} 
+0

+1, pero podría simplemente usar AppendLine en su lugar –

+10

¿O puede usar 'ToString'? – Justin

+0

Estoy usando ToString y creo que está bien. Me gustaría ir con la solución de Andrew si solo quiero la excepción interna más baja (con la razón real) o selección similar ... funciona tanto :) :) – EeKay

5

Si pasa su excepción a la siguiente función, le dará todos los métodos y detalles que son razones de la excepción.

public string GetAllFootprints(Exception x) 
{ 
     var st = new StackTrace(x, true); 
     var frames = st.GetFrames(); 
     var traceString = new StringBuilder(); 

     foreach (var frame in frames) 
     { 
      if (frame.GetFileLineNumber() < 1) 
       continue; 

      traceString.Append("File: " + frame.GetFileName()); 
      traceString.Append(", Method:" + frame.GetMethod().Name); 
      traceString.Append(", LineNumber: " + frame.GetFileLineNumber()); 
      traceString.Append(" --> "); 
     } 

     return traceString.ToString(); 
} 
+0

Muy útil. He hecho un [método de extensión] (https://github.com/VeaceslavWD/EasySharp/blob/master/NHelpers/CustomExtensionMethods/ExceptionHelper.cs) según su ejemplo. Por cierto, en caso de una gran cantidad de iteraciones es mejor utilizar la clase 'StringBuilder'. –

Cuestiones relacionadas