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

84

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

Epaga
источник

Ответы:

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()
Джон Скит
источник
1
  catch (Exception ex)
{
    Console.WriteLine(ex.StackTrace);
}
Стив Бруйяр
источник
1
Это не будет включать информацию о сообщении или внутреннем исключении.
Дрю Ноукс
0

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

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

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

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

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

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

Gianlucaparadise
источник
-1

Также посмотрите Log4Net ... это порт Log4J для .NET.

nbevans
источник