C# 异常堆栈跟踪是否可以为空?

C# 异常堆栈跟踪是否可以为空?,c#,exception,C#,Exception,我发现,如果捕获异常e,e.innerException可能为null 在catch块中的任何可能情况下,e.StackTrace是否也可能为空 try { } catch(Exception e) { //can e.StackTrace be null here? } 对 如果创建一个newexception()并且不抛出它,那么除了数据和消息之外的所有属性都将为null。一个例子证明了堆栈跟踪在catch块中可以为null,同样可以说明: public class DerpExcept

我发现,如果捕获异常e,e.innerException可能为null

在catch块中的任何可能情况下,e.StackTrace是否也可能为空

try {

}
catch(Exception e)
{
//can e.StackTrace be null here?
}


如果创建一个
newexception()
并且不抛出它,那么除了
数据和
消息之外的所有属性都将为null。

一个例子证明了
堆栈跟踪在catch块中可以为null,同样可以说明:

public class DerpException : Exception
{
    public override string StackTrace
    {
        get { return null; }
    }
}

如果您使用
[HandleProcessCorruptedStateExceptions]
函数的try-catch属性,您可以在其中捕获异常,以及是否从本机代码引发异常

System.AccessViolationException
异常类型的
StackTrace
可能为空

不确定这是否与调试/发布构建和/或生成的pdb文件有关。
我观察过发布版本的这种崩溃。

我认为更重要的是,如果您没有正确编写异常代码,。如果它在catch块中呢?@Servy:错。(试试看)@HenleyChiu:它可以是空的,但我不认为它可以是空的。我会说是的:
StackTrace
是虚拟的,我真的很震惊,因为派生类不应该做这样的事情。看看dotPeek,该属性实际上是在
System.Runtime.InteropServices.\u Exception
接口中定义的,这解释了为什么它在基本
系统中是虚拟的。异常
类-作为纯托管代码的低级提供者,此接口的原因是我无法理解的。异常
类仍然可以将其标记为
密封
,防止进一步重写该属性。您可以密封该属性(或方法)不封全班。这就是我的建议。我一开始读错了,但你甚至不需要这样做,因为在C#中方法默认不是虚拟的,你只需要不将方法标记为虚拟,这又回到了原点。这似乎是一个深思熟虑的设计决定,而且非常奇怪。