Freigeben über


Verwenden einer Ausnahmebehandlungsroutine

Die folgenden Beispiele veranschaulichen die Verwendung eines Ausnahmehandlers.

In einigen Beispielen wird die GetExceptionCode-Funktion im __except Filterausdruck verwendet, um den Ausnahmetyp zu überprüfen, bevor der Handler ausgeführt wird. Auf diese Weise kann das System die Suche nach einem geeigneten Handler fortsetzen, wenn ein anderer Ausnahmetyp auftritt.

Geben Sie im Allgemeinen nur EXCEPTION_EXECUTE_HANDLER aus einem Ausnahmefilter zurück, wenn der Ausnahmetyp erwartet wird und die fehlerhafte Adresse bekannt ist. Sie sollten zulassen, dass der Standard ausnahmehandler unerwartete Ausnahmetypen und fehlerhafte Adressen verarbeitet.

Beispiel 1

Im folgenden Codefragment wird die strukturierte Ausnahmebehandlung verwendet, um zu überprüfen, ob ein Divisionsvorgang auf zwei 32-Bit-Ganzzahlen zu einem Division-by-Zero-Fehler führt. Wenn dies der Fall ist, gibt die Funktion FALSE zurück. Andernfalls wird WAHR zurückgegeben.

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

Beispiel 2

Die folgende Beispielfunktion ruft die DebugBreak-Funktion auf und verwendet die strukturierte Ausnahmebehandlung, um nach einer Haltepunkt-Ausnahme zu suchen. Wenn ein Ereignis auftritt, bedeutet dies, dass die Ausnahme nicht von einem Debugger behandelt wurde und die Funktion FALSE zurückgibt, andernfalls 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;
}

Beispiel 3

Das folgende Beispiel zeigt die Interaktion geschachtelter Handler. Die RaiseException-Funktion verursacht eine Ausnahme im geschützten Textkörper eines Beendigungshandlers, der sich im geschützten Textkörper eines Ausnahmehandlers befindet. Die Ausnahme bewirkt, dass das System die FilterFunction-Funktion auswertet, deren Rückgabewert wiederum bewirkt, dass der Ausnahmehandler aufgerufen wird. Bevor der Ausnahmebehandlungsblock ausgeführt wird, wird der __finally Block des Beendigungshandlers ausgeführt, da der Kontrollfluss den __try Block des Beendigungshandlers verlassen hat.

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