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?

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.


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

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



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.


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


-1

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.