使用例外狀況處理程式

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

範例 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

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

此外,在例外狀況處理程式的 __try 區塊中使用 return 語句,與在終止處理程式的 __try 區塊中使用 return 不同,這會導致__try區塊異常終止。 這是例外狀況處理程式中傳回語句的有效用法。

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;
}

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

範例 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 
    } 
}