共用方式為


使用例外狀況處理程式

下列範例示範如何使用例外狀況處理程式。

某些範例會使用__except篩選表達式內的 GetExceptionCode 函式,在執行處理程式之前先檢查例外狀況類型。 這可讓系統在發生某種其他類型的例外狀況時,繼續搜尋適當的處理程式。

一般而言,只有在預期例外狀況類型且已知錯誤位址時,才會從例外狀況篩選傳回EXCEPTION_EXECUTE_HANDLER。 您應該允許預設例外狀況處理程式處理非預期的例外狀況類型和錯誤位址。

範例 1

下列代碼段會使用結構化錯誤處理來檢查兩個 32 位整數上的除法操作是否會導致除以零錯誤。 如果發生這種情況,函式會傳回 false ,否則會傳回 true

BOOL SafeDiv(INT32 dividend, INT32 divisor, INT32 *pResult)
{
    __try 
    { 
        *pResult = dividend / divisor; 
    } 
    __except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ? 
             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    { 
        return FALSE;
    }
    return TRUE;
} 

範例 2

下列範例函式會呼叫 DebugBreak 函式,並使用結構化例外狀況處理來檢查斷點例外狀況。 如果發生,這表示例外狀況不是由調試程序處理,而函式會傳回 FALSE,否則會傳回 TRUE

BOOL CheckForDebugger()
{
    __try 
    {
        DebugBreak();
    }
    __except(GetExceptionCode() == EXCEPTION_BREAKPOINT ? 
             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) 
    {
        // No debugger is attached, so return FALSE 
        // and continue.
        return FALSE;
    }
    return TRUE;
}

範例 3

下列範例顯示巢狀處理程序的互動。 RaiseException 函式會在終止處理程式的受防護主體中造成例外狀況,該處理程式位於例外狀況處理程式的受防護主體內。 例外狀況會導致系統評估 FilterFunction 函式,其傳回值又會導致叫用例外狀況處理程式。 不過,在執行例外狀況處理程式區塊之前,會執行終止處理程式的 __finally 區塊,因為控制流程已離開終止處理程式的 __try 區塊。

DWORD FilterFunction() 
{ 
    printf("1 ");                     // printed first 
    return EXCEPTION_EXECUTE_HANDLER; 
} 
 
VOID main(VOID) 
{ 
    __try 
    { 
        __try 
        { 
            RaiseException( 
                1,                    // exception code 
                0,                    // continuable exception 
                0, NULL);             // no arguments 
        } 
        __finally 
        { 
            printf("2 ");             // this is printed second 
        } 
    } 
    __except ( FilterFunction() ) 
    { 
        printf("3\n");                // this is printed last 
    } 
}