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


83

Чи існує метод C #, еквівалентний Java, Exception.printStackTrace()чи мені доводиться писати щось самостійно, пробираючись через InnerExceptions?

Відповіді:


120

Спробуйте це:

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, і, здається, це вже неправда
selalerer

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

Чи не існує API реєстрації C #, який може взяти виняток як аргумент і обробити все за вас, як це робить Log4J від Java?

Тобто використовуйте Log4NET.


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

0

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

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

На жаль, цього неможливо зробити в PCL або в бібліотеці .NETStandard


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.