Как печатать полную трассировку стека в исключении?
Например, в одном месте...
//---------------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); // <----------------
}
Стоп файл, который я печатаю, начинается только с a до b,
он не включает в себя внутреннюю stacktrace из WebException.
Как я могу распечатать все stacktrace???
Ответы
Ответ 1
Я обычно использую метод .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
Ответ 2
Используйте такую функцию:
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));
}
Ответ 3
1. Создать метод: Если вы передадите свое исключение следующей функции, она предоставит вам все методы и детали, которые являются причинами исключения.
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();
}
2. Вызов метода: Вы можете вызвать метод следующим образом.
try
{
// code part which you want to catch exception on it
}
catch(Exception ex)
{
Debug.Writeline(GetAllFootprints(ex));
}
3. Получите результат:
File: c:\MyProject\Program.cs, Method:MyFunction, LineNumber: 29 -->
File: c:\MyProject\Program.cs, Method:Main, LineNumber: 16 -->