C# 异常堆栈跟踪是否可以为空?
我发现,如果捕获异常e,e.innerException可能为null 在catch块中的任何可能情况下,e.StackTrace是否也可能为空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
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#中方法默认不是虚拟的,你只需要不将方法标记为虚拟,这又回到了原点。这似乎是一个深思熟虑的设计决定,而且非常奇怪。