识别腐败国家例外的更好方法

时间:2014-03-27 13:37:11

标签: c# exception-handling .net-4.5 corrupted-state-exception

让我们再试一次,减少开销:

如何确定Exception是否为CorruptedStateException?

据我所知,没有任何常见的超类,所有CorruptedStateExceptions都从(独占)继承而且我没有找到其他属性/标志/属性来识别它们。

目前,我可以提出的最佳方法是分两步:在下面的案例中,ThirdPartyCall设置了属性[HandleProcessCorruptedStateExceptions][SecurityCritical]来捕获CorruptedStateExceptions而ThirdPartyCallInternal没有“T。如果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;
    }
}

是否还有其他(更简洁,更简单,......)方法来确定Exception是否会导致应用程序关闭的CorruptedStateException?

1 个答案:

答案 0 :(得分:3)

也许存在一个误解:“损坏的状态”在任何其他类型的异常上都是一个标志,而不是一个例外。因此你的陈述

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

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

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

这样做可以简化您的代码

[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 Error Reporting,从Microsoft获取崩溃转储并进行分析。