Как напечатать полную трассировку стека в исключении?
например, в одном месте...
//---------------a
try
{
// some network call
}
catch(WebException we)
{
throw new MyCustomException("some message ....", we);
}
...и в другом месте...
//--------------b
try
{
// invoke code above
}
catch(MyCustomException we)
{
Debug.Writeline(we.stacktrace); // <----------------
}
stacktrace я печатаю, это только начало от a до b,
он не включает в себя внутренний stacktrace из WebException.
Как я могу распечатать все stacktrace???
3 ответов:
Я обычно использую .Метод ToString() для исключений, чтобы представить полную информацию об исключении (включая внутреннюю трассировку стека) в тексте:
catch (MyCustomException ex) { Debug.Writeline(ex.ToString()); }пример вывода:
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
используйте такую функцию:
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(); }затем вы можете назвать это так:
try { // invoke code above } catch(MyCustomException we) { Debug.Writeline(FlattenException(we)); }
Если вы передадите свое исключение следующей функции, она предоставит вам все методы и детали, которые являются причинами исключения.
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(); }результат:
File: c:\MyProject\Program.cs, метод: MyFunction, LineNumber: 29 -->
Файл: c:\MyProject\Program.cs, метод: Main, LineNumber: 16 -->
Comments