C # odpowiednik Exception.printStackTrace () Javy?

84

Czy istnieje metoda C # równoważna z Javą, Exception.printStackTrace()czy też muszę napisać coś samodzielnie, przechodząc przez InnerExceptions?

Epaga
źródło

Odpowiedzi:

121

Spróbuj tego:

Console.WriteLine(ex.ToString());

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

Domyślna implementacja ToString uzyskuje nazwę klasy, która zgłosiła bieżący wyjątek, komunikat, wynik wywołania ToString w przypadku wyjątku wewnętrznego oraz wynik wywołania Environment.StackTrace. Jeśli którykolwiek z tych elementów członkowskich ma wartość null, jego wartość nie jest uwzględniana w zwracanym ciągu.

Zauważ, że w powyższym kodzie wywołanie ToStringnie jest wymagane, ponieważ istnieje przeciążenie, które pobiera System.Objecti wywołuje ToStringbezpośrednio.

Drew Noakes
źródło
1
Właśnie wypróbowałem to w .Net Core 2.1 w systemie Linux i wydaje się, że to już nieprawda
selalerer
104

Chciałbym dodać: Jeśli chcesz wydrukować stos poza wyjątkiem, możesz użyć:

Console.WriteLine(System.Environment.StackTrace);
Ryan Cook
źródło
10

Jak mówi Drew, wystarczy przekonwertować wyjątek na łańcuch. Na przykład ten program:

using System;

class Test
{
    static void Main()
    {
        try
        {
            ThrowException();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

    static void ThrowException()
    {

        try
        {
            ThrowException2();
        }
        catch (Exception e)
        {
            throw new Exception("Outer", e);
        }
    }

    static void ThrowException2()
    {
        throw new Exception("Inner");
    }
}

Tworzy ten wynik:

System.Exception: Outer ---> System.Exception: Inner
   at Test.ThrowException2()
   at Test.ThrowException()
   --- End of inner exception stack trace ---
   at Test.ThrowException()
   at Test.Main()
Jon Skeet
źródło
1
  catch (Exception ex)
{
    Console.WriteLine(ex.StackTrace);
}
Steve Brouillard
źródło
1
Nie będzie to obejmować szczegółów wiadomości ani wewnętrznych wyjątków.
Drew Noakes
0

Czy nie ma interfejsu API C # Logging, który może przyjąć wyjątek jako argument i obsłużyć wszystko za Ciebie, tak jak robi to Java Log4J?

To znaczy użyj Log4NET.

JeeBee
źródło
Myślę, że to właśnie wskazuje, dlaczego Microsoft mógł nie zapewnić takiej funkcjonalności w C #, jak Java (będąc starszym językiem opracowanym w prostszych czasach). To znaczy, jest lepszy sposób, który jest zalecany.
JeeBee
0

Ponieważ odpowiedź @ ryan-cook nie zadziałała dla mnie, jeśli chcesz wydrukować ślad stosu bez wyjątku, możesz użyć:

System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace();
Console.WriteLine(stackTrace)

Niestety nie można tego zrobić w PCL lub w bibliotece .NETStandard

gianlucaparadise
źródło
-1

Spójrz także na Log4Net ... to port Log4J do .NET.

nbevans
źródło