除了AccessViolationException
以外,还有哪些可能的“损坏状态异常”类型?
尤其可以安全地假设OutOfMemoryException
,ThreadAbortedException
,SEHException
,RuntimeWrappedException
等均不需要使用HandleProcessCorruptedStateExceptionsAttribute
被catch (Exception)
子句困住了?
即使对于示例,猜测,近似值,我也对CLR有时或始终将哪些异常类型视为CSE感兴趣。现有的网络资源看上去CSE是AccessViolationException
的近义词,但是我怀疑即使对于我的适度需求,这也可能太不准确了。
我需要知道,每当我在外围负责的古代代码中发现catch (OutOfMemoryException)
(或其他明显处理其他低级异常的构造)时,是否可以使异常处理代码无法访问,或存在迁移到.NET 4的风险。
到目前为止,我最好的选择是扫描异常类型的Microsoft文档中是否提到HandleProcessCorruptedStateExceptionsAttribute
,但是我不知道这种行为细节是否应该在所有.NET 4版本中完全兼容,并且/或针对受CLR更改影响的每种托管异常类型进行详细记录。
答案 0 :(得分:1)
我不确定是否存在有限的异常集(无论CLR版本如何,但一般而言)。
如果您查看this CLR函数,至少本机代码(或CLR本身)可能引发任何异常,将其指定为损坏状态。
// Signature simplified for purposes of that answer, check link above for actual signature.
void RealCOMPlusThrow(OBJECTREF throwable, CorruptionSeverity severity = NotCorrupting);
该函数(即包装它的宏COMPlusThrow
)在(核心)CLR中的多个位置被调用。
函数IsProcessCorruptedStateException
函数似乎最终用于确定异常是否被视为状态破坏。此函数有两个“重载”。
One很有帮助,因为它列出了以下异常代码:
STATUS_ACCESS_VIOLATION
STATUS_STACK_OVERFLOW
EXCEPTION_ILLEGAL_INSTRUCTION
EXCEPTION_IN_PAGE_ERROR
EXCEPTION_INVALID_DISPOSITION
EXCEPTION_NONCONTINUABLE_EXCEPTION
EXCEPTION_PRIV_INSTRUCTION
STATUS_UNWIND_CONSOLIDATE
至少它们最初映射到.NET异常对象。
但是,如果other one“仅” checks被标记为异常对象(本机,非托管对象),则表明状态损坏。
现在,我距离成为CLR代码的专家(YMMV)还很遥远。
当然可以花一些时间在CLR代码中,以了解损坏的状态处理的工作原理以及处理C#代码带来的后果。 但是根据您确实要通过您的问题来实现的目标 可能会导致严重的剃须刮毛。 ;-)