C#中等价于Java的Exception.printStackTrace()的方法是什么?

92

在C#中是否有与Java的Exception.printStackTrace()相当的方法,还是我必须自己编写代码,通过处理InnerExceptions来实现?

8个回答

131

试一下这个:

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
刚在 Linux 上尝试了 .Net Core 2.1,似乎它不再是真的了。 - selalerer

113

我想补充一下:如果你想在异常以外的情况下打印堆栈,可以使用以下方法:

Console.WriteLine(System.Environment.StackTrace);

10

正如Drew所说,只需将异常转换为字符串即可实现此操作。例如,以下程序:

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

3

1
那不会包括消息或内部异常细节。 - Drew Noakes

2
  catch (Exception ex)
{
    Console.WriteLine(ex.StackTrace);
}

2
这不会包括消息或内部异常细节。 - Drew Noakes

0

是否没有一个能够接受异常作为参数并处理所有事情的C#日志API,就像Java的Log4J一样?

即使用Log4NET。


我认为这正是为什么微软没有在C#中提供Java所提供的功能的原因(因为Java是在更简单的时代开发的较旧的语言)。也就是说,有一种更好的推荐方法。 - JeeBee

0

由于 @ryan-cook 的回答对我无效,如果您想在没有异常的情况下打印堆栈跟踪,可以使用以下方法:

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

很遗憾,这无法在PCL或.NETStandard库中完成。


-1

也可以看看Log4Net,它是Log4J到.NET的移植版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接