Эквивалент C # Java Exception.printStackTrace ()?


84

Есть ли в C # метод, эквивалентный Java, Exception.printStackTrace()или мне нужно что-то писать самому, работая с InnerExceptions?

Ответы:


121

Попробуй это:

Console.WriteLine(ex.ToString());

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

Реализация ToString по умолчанию получает имя класса, который вызвал текущее исключение, сообщение, результат вызова ToString для внутреннего исключения и результат вызова Environment.StackTrace. Если любой из этих членов имеет значение NULL, его значение не включается в возвращаемую строку.

Обратите внимание, что в приведенном выше коде вызов ToStringне требуется, поскольку существует перегрузка, которая принимает System.Objectи вызывает ToStringнапрямую.


1
Только что попробовал это в .Net Core 2.1 на Linux, и кажется, что это уже неправда
продавец

104

Я хотел бы добавить: если вы хотите распечатать стек вне исключения, вы можете использовать:

Console.WriteLine(System.Environment.StackTrace);

10

Как говорит Дрю, это делает простое преобразование исключения в строку. Например, эта программа:

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

Производит этот вывод:

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

Нет ли C # Logging API, который мог бы принимать исключение в качестве аргумента и обрабатывать все за вас, как это делает Java Log4J?

Т.е. используйте Log4NET.


Я думаю, это указывает на то, почему Microsoft, возможно, не предоставила в C # такую ​​функциональность, как Java (более старый язык, разработанный в более простые времена). Т.е. есть лучший способ, который рекомендуется.
JeeBee 02

0

Поскольку ответ @ ryan-cook у меня не сработал, если вы хотите распечатать трассировку стека без исключения, вы можете использовать:

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

К сожалению, это невозможно сделать в PCL или в .NETStandard Library.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.