【问题标题】:Corrupted State Exception types other than AccessViolationExceptionAccessViolationException 以外的损坏状态异常类型
【发布时间】:2019-08-31 19:19:11
【问题描述】:

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

特别是,假设OutOfMemoryExceptionThreadAbortedExceptionSEHExceptionRuntimeWrappedException 等都不需要使用HandleProcessCorruptedStateExceptionsAttribute 是否会被catch (Exception) 捕获?子句?

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

我需要知道,每当我在我主要负责的古老代码中发现 catch (OutOfMemoryException)(或另一个显式处理其他低级异常的构造)时,异常处理代码是否可能无法访问,或者是迁移到 .NET 4 可能导致无法访问。

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

【问题讨论】:

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


    【解决方案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# 代码中处理这些状态会产生什么后果。 但取决于你真正试图通过你的问题来实现什么 可能会导致一些严重的刮胡子。 ;-)

    【讨论】:

    • 这非常有帮助。我从您那里了解到,“损坏的进程状态”是与 SEH(或托管)异常类型正交的预先存在的概念。当它命中时,我收到了一个更好的条件类型近似值,并且(从 CLR 代码中的 CorruptionSeverity.ReuseForReraise 注意到)它在进程中跨反射和 AD 边界的旅行也是可选的,TargetInvocationException 是另一个潜在的例子CSE,我将发布一个关于 OutOfMemoryException 的特别有价值的课程,作为单独的 Q+A 对。
    • 按照承诺分开 Q+A 对 created
    猜你喜欢
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多