AccessViolationException以外的其他损坏的状态异常类型

时间:2019-04-10 10:50:45

标签: .net exception clr corrupted-state-exception

除了AccessViolationException以外,还有哪些可能的“损坏状态异常”类型?

尤其可以安全地假设OutOfMemoryExceptionThreadAbortedExceptionSEHExceptionRuntimeWrappedException等均不需要使用HandleProcessCorruptedStateExceptionsAttributecatch (Exception)子句困住了?

即使对于示例,猜测,近似值,我也对CLR有时或始终将哪些异常类型视为CSE感兴趣。现有的网络资源看上去CSE是AccessViolationException的近义词,但是我怀疑即使对于我的适度需求,这也可能太不准确了。

我需要知道,每当我在外围负责的古代代码中发现catch (OutOfMemoryException)(或其他明显处理其他低级异常的构造)时,是否可以使异常处理代码无法访问,或存在迁移到.NET 4的风险。

到目前为止,我最好的选择是扫描异常类型的Microsoft文档中是否提到HandleProcessCorruptedStateExceptionsAttribute,但是我不知道这种行为细节是否应该在所有.NET 4版本中完全兼容,并且/或针对受CLR更改影响的每种托管异常类型进行详细记录。

1 个答案:

答案 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#代码带来的后果。 但是根据您确实要通过您的问题来实现的目标 可能会导致严重的剃须刮毛。 ;-)