2

让我们以更少的开销再试一次:

如何确定异常是否为 CorruptedStateException?

据我所知,所有 CorruptedStateExceptions 都没有继承(独占)的通用超类,而且我发现没有其他属性/标志/属性可以用来识别它们。

现在我能想到的最好的方法是分两步工作:在下面的情况下ThirdPartyCall,有属性[HandleProcessCorruptedStateExceptions][SecurityCritical]设置为捕获 CorruptedStateExceptions 而ThirdPartyCallInternal没有。如果ThirdPartyCallInternal捕捉到一个异常,它就不是 CSE,如果只ThirdPartyCall捕捉到它,它就是一个。

[HandleProcessCorruptedStateExceptions]
[SecurityCritical]
public static void ThirdPartyCall()
{
    bool thrownExceptionIsCorruptedState = true;
    try
    {
        ThirdPartyCallInternal(ref thrownExceptionIsCorruptedState);
    }
    catch (Exception ex)
    {
        if (thrownExceptionIsCorruptedState)
        {
            //This is pretty much the only thing we'd like to do...
            log.Fatal("CorruptedStateException was thrown",ex);
        }
        throw;
    }
}

private static void ThirdPartyCallInternal(ref bool thrownExceptionIsCorruptedState)
{
    try
    {
        ThirdPartyLibrary.DoWork();
    }
    catch (Exception)
    {
        //Exception was caught without HandleProcessCorruptedStateExceptions => it's not a corruptedStateException
        thrownExceptionIsCorruptedState = false;
        throw;
    }
}

是否有任何其他(更清洁,更简单,......)方法来确定异常是否是 CorruptedStateException 会导致应用程序关闭?

4

1 回答 1

3

也许有一个误解:“损坏的状态”更像是任何其他类型异常的标志,而不是异常本身。因此你的陈述

log.Fatal("CorruptedStateException was thrown",ex);

是不正确的。没有抛出 CorruptedStateException 类型的异常。例如,真正的异常类型可能是 AccessViolationException,您应该调查其原因。

因此,我认为异常是否是损坏的状态异常并不重要。重要的是您的应用程序实际上捕获了异常,您会收到有关它的通知并且您可以修复它。

这样做可以将您的代码简化为

[HandleProcessCorruptedStateExceptions]
[SecurityCritical]
public static void ThirdPartyCall()
{
    try
    {
        ThirdPartyLibrary.DoWork();
    }
    catch (Exception ex)
    {   
        //This is pretty much the only thing we'd like to do...
        log.Fatal("Exception was thrown",ex);
        Environment.FailFast("Fatal exception in 3rd party library");
    }
}

除此之外,也许最好让操作系统来处理这个崩溃,而不是试图将一些东西写入日志文件。请注意,log4net 也可能已经被销毁,并且无法再写入日志文件。

相反,注册Windows 错误报告,从 Microsoft 获取故障转储并分析它们。

于 2014-04-07T13:00:10.877 回答