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

Corrupted State Exception types other than AccessViolationException

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

特别是,假设 OutOfMemoryExceptionThreadAbortedExceptionSEHExceptionRuntimeWrappedException 等中的 none 需要使用HandleProcessCorruptedStateExceptionsAttributecatch (Exception) 子句捕获?

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

我需要知道,每当我注意到我外围负责的古代代码中的 catch (OutOfMemoryException)(或另一个显式处理其他低级异常的构造)时,是否可以编写异常处理代码迁移到 .NET 4 无法访问,或有可能变得无法访问。

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

我不确定是否存在有限的异常集(不管 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函数似乎最终用于确定异常是否被认为是状态破坏。这个函数有两个"overloads".

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 "simply" checks 如果异常对象(本机,非托管)已被标记为状态损坏。

现在,我离成为 CLR 代码的专家还很遥远,所以 YMMV。

人们肯定可以在 CLR 代码中花费数小时来弄清楚损坏的状态处理是如何工作的,以及在 C# 代码中处理损坏的状态会产生什么后果。 但是取决于你是什么真的试图通过你的问题来实现 可能会导致一些严重的胡扯。 ;-)