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?

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.


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);

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()



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.


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.