2

オーバーヘッドを減らしてもう一度試してみましょう。

例外が CorruptedStateException かどうかを判断する方法は?

私が知っていることから、すべての CorruptedStateExceptions が (排他的に) 継承する共通のスーパークラスはなく、それらを識別するために使用できる他のプロパティ/フラグ/属性は見つかりませんでした。

今のところ、私ThirdPartyCallが思い付くことができる最善の方法は、2 つのステップで作業することです。例外をキャッチする場合は CSE ではなく、キャッチするだけの場合は 1 つです。[HandleProcessCorruptedStateExceptions][SecurityCritical]ThirdPartyCallInternalThirdPartyCallInternalThirdPartyCall

[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 に答える