簡體   English   中英

SEH錯誤報告

[英]SEH error reporting

我有一個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;
}

在這種情況下,程序應具有異常終止功能,並且應將異常傳遞給操作系統以進行處理。 那是對的嗎?

如果在過濾器中引發異常,則將再次使用filter方法。 您的異常將由相同的__except塊處理。
但是在您的過濾器方法中使用另一個__try __except塊沒有問題。
不幸的是,我無法給您任何參考。 我只是自我嘗試,您也可以。 只需將其除以零即可。
通常,我不使用SEH,但是有幾次我沒有提出在filter方法中引發異常的問題。 但是當我尋找這個時,我沒有在msdn中找到任何東西。

執行此操作時,需要注意很多事項。 當您的SEH處理程序運行時,您的進程處於完全未知的狀態,並且您嘗試指示用戶的某些操作可能會失敗。 例如,如果異常是堆棧溢出,那么您在這里幾乎無能為力。 如果您在此處使用UI框架(如MFC),則可能是因為某些重要操作導致應用崩潰而導致應用崩潰或處於不一致狀態。 如果您的應用程序是多線程的,則需要知道進入此過濾器時那些其他線程仍將在運行,並且處理時要格外小心。

如果您確實需要執行此操作,則另一種方法是執行監視程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM