0

Visual Studio 2008 C ++プログラムがあり、プログラムは__try/__exceptブロックでラップされてSEH例外をキャプチャします。例外フィルターはエラーログを作成し、ユーザーに欠陥レポートの送信方法に関する詳細な指示を提供します。

__tryフィルタ内のコードを別の/__exceptブロックでラップする必要がありますか?そうでない場合、それを除いてどうなりますか?もしそうなら、それはどのように扱われるべきですか?

static int MyFilter( struct _EXCEPTION_POINTERS* ep )
{
    /*
    Code to log the exception information, and instruct the user 
    on how to submit a defect report. Should this be in another
    __try/__except block?
    */
    return EXCEPTION_EXECUTE_HANDLER;
}

int WINAPI _tWinMain( HINSTANCE hInstance, 
                      HINSTANCE /*hPrevInstance*/, 
                      LPTSTR lpstrCmdLine, 
                      int nCmdShow )
{
    int result = 0;

    __try
    {
        result = Execute( hInstance, lpstrCmdLine, nCmdShow );
    }
    __except( MyFilter( GetExceptionInformation() ) )
    {
        // empty
    }

    return 0;
}

ありがとう、PaulH


編集:例外が発生した 場合MyFilter、私は無限の例外ループに入ります。だから、それは必要__try/__except処理をしているように見えます。私はこれを行うことを検討しています:

static int MyFilter( struct _EXCEPTION_POINTERS* ep )
{
    __try 
    {
        /*
        Code to log the exception information, and instruct the user 
        on how to submit a defect report. 
        */

       // cause an exception
       int x = 0, y = 1 / x;
    }
    __except( EXCEPTION_EXECUTE_HANDLER ) { /*empty*/ }
    return EXCEPTION_EXECUTE_HANDLER;
}

この場合、プログラムは異常終了し、OSに例外を渡して処理する必要があります。あれは正しいですか?

4

2 に答える 2

0

フィルタで例外を発生させると、再びフィルタメソッドになります。例外は同じ__exceptブロックによって処理されます。
ただし、フィルターメソッドで別の__try__exceptブロックを使用しても問題はありません。
残念ながら、これについて言及することはできません。自分で試してみましたが、あなたもできます。ゼロによる除算を強制するだけです。
通常はSEHを使用しませんが、フィルターメソッドで例外を発生させることに問題はありませんでした。しかし、これを探したとき、msdnには何も見つかりませんでした。

于 2011-04-06T16:57:37.503 に答える
0

これを行うときに注意する必要があることがたくさんあります。SEHハンドラーを実行すると、プロセスは完全に不明な状態になり、ユーザーに指示するために実行しようとする操作の一部が失敗する可能性があります。たとえば、例外がスタックオーバーフローであった場合、ここでできることはほとんどありません。ここでUIフレームワーク(MFCなど)を使用している場合、重要な操作の途中でアプリがクラッシュした可能性があるため、UIフレームワークが壊れているか、一貫性のない状態になっている可能性があります。アプリがマルチスレッドである場合は、このフィルターにアクセスしたときに他のスレッドが引き続き実行されていることを知っておく必要があります。

本当にこれを行う必要がある場合、1つの代替アプローチは、それを行うためのウォッチドッグプロセスを用意することです。

于 2011-04-06T17:22:37.290 に答える