C # entspricht Javas Exception.printStackTrace ()?

83

Gibt es eine C # -äquivalente Methode zu Java Exception.printStackTrace()oder muss ich selbst etwas schreiben, um mich durch die InnerExceptions zu arbeiten?

Epaga
quelle

Antworten:

120

Versuche dies:

Console.WriteLine(ex.ToString());

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

Die Standardimplementierung von ToString erhält den Namen der Klasse, die die aktuelle Ausnahme ausgelöst hat, die Nachricht, das Ergebnis des Aufrufs von ToString für die innere Ausnahme und das Ergebnis des Aufrufs von Environment.StackTrace. Wenn eines dieser Elemente null ist, ist sein Wert nicht in der zurückgegebenen Zeichenfolge enthalten.

Beachten Sie, dass im obigen Code der Aufruf von ToStringnicht erforderlich ist, da eine Überlastung vorliegt, die direkt System.Objectanruft ToString.

Drew Noakes
quelle
1
Ich habe es gerade in .Net Core 2.1 unter Linux versucht und es scheint, dass es nicht mehr wahr ist
Selalerer
100

Ich möchte hinzufügen: Wenn Sie den Stapel außerhalb einer Ausnahme drucken möchten, können Sie Folgendes verwenden:

Console.WriteLine(System.Environment.StackTrace);
Ryan Cook
quelle
10

Wie Drew sagt, bewirkt dies nur das Konvertieren der Ausnahme eines Strings. Zum Beispiel dieses Programm:

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

Erzeugt diese Ausgabe:

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
quelle
1
  catch (Exception ex)
{
    Console.WriteLine(ex.StackTrace);
}
Steve Brouillard
quelle
1
Das beinhaltet nicht die Nachricht oder Details der inneren Ausnahme.
Drew Noakes
0

Gibt es keine C # -Protokollierungs-API, die eine Ausnahme als Argument verwenden und alles für Sie erledigen kann, wie es Javas Log4J tut?

Verwenden Sie also Log4NET.

JeeBee
quelle
Ich denke, es wird darauf hingewiesen, warum Microsoft in C # möglicherweise keine solche Funktionalität bereitgestellt hat wie Java (die ältere Sprache, die in einfacheren Zeiten entwickelt wurde). Dh es gibt einen besseren Weg, der empfohlen wird.
JeeBee
0

Da die Antwort von @ ryan-cook bei mir nicht funktioniert hat, können Sie Folgendes verwenden, wenn Sie den Stack-Trace ohne Ausnahme drucken möchten:

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

Dies ist leider nicht in einer PCL oder in einer .NETStandard-Bibliothek möglich

Gianlucaparadise
quelle
-1

Schauen Sie sich auch Log4Net an ... es ist ein Port von Log4J nach .NET.

nbevans
quelle