Как напечатать полную трассировку стека в исключении?



например, в одном месте...



//---------------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???

586   3  

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

    Ничего не найдено.