C# 相当于 Java 的 Exception.printStackTrace()?

Posted

技术标签:

【中文标题】C# 相当于 Java 的 Exception.printStackTrace()?【英文标题】:C# equivalent to Java's Exception.printStackTrace()? 【发布时间】:2010-09-24 22:32:48 【问题描述】:

是否有与 Java 的 Exception.printStackTrace() 等效的 C# 方法,还是我必须自己编写一些东西,通过 InnerExceptions 工作?

【问题讨论】:

【参考方案1】:

试试这个:

Console.WriteLine(ex.ToString());

来自http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx:

ToString的默认实现获取抛出当前异常的类名、消息、内部异常调用ToString的结果、调用Environment.StackTrace的结果。如果这些成员中的任何一个为 null,则其值不包含在返回的字符串中。

请注意,在上面的代码中,不需要调用ToString,因为有一个重载需要System.Object 并直接调用ToString

【讨论】:

刚刚在 Linux 上的 .Net Core 2.1 中尝试过,现在似乎不再正确【参考方案2】:

我想补充一下:如果要在异常之外打印堆栈,可以使用:

Console.WriteLine(System.Environment.StackTrace);

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

http://msdn.microsoft.com/en-us/library/system.exception.stacktrace.aspx

Console.WriteLine(myException.StackTrace);

【讨论】:

不包括消息或内部异常详细信息。【参考方案5】:
  catch (Exception ex)

    Console.WriteLine(ex.StackTrace);

【讨论】:

不包括消息或内部异常详细信息。【参考方案6】:

是否没有像 Java 的 Log4J 那样可以将异常作为参数并为您处理所有事情的 C# Logging API?

即,使用 Log4NET。

【讨论】:

我认为它指出了为什么微软可能没有像 Java 那样在 C# 中提供这样的功能(作为在更简单的时代开发的旧语言)。即,推荐一种更好的方法。【参考方案7】:

由于@ryan-cook 的回答对我不起作用,如果您想打印堆栈跟踪而不出现异常,您可以使用:

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

很遗憾,这不能在 PCL 或 .NETStandard 库中完成

【讨论】:

【参考方案8】:

另外看看 Log4Net...它是从 Log4J 到 .NET 的一个端口。

【讨论】:

以上是关于C# 相当于 Java 的 Exception.printStackTrace()?的主要内容,如果未能解决你的问题,请参考以下文章

C#相当于Java的Thread.setDaemon?

相当于 C# 中的 java 包

c#与java对比

C++ java 和 C# 的区别

C# 中的 Java RuntimeException 等价物?

Java Annotations 和 C# Attributes 有啥异同?