Dela via


Använda en undantagshanterare

Följande exempel visar användningen av en undantagshanterare.

Några av exemplen använder funktionen GetExceptionCode i __except filteruttrycket för att kontrollera undantagstypen innan du kör hanteraren. Detta gör det möjligt för systemet att fortsätta sin sökning efter en lämplig hanterare om någon annan typ av undantag inträffar.

I allmänhet returnerar du bara EXCEPTION_EXECUTE_HANDLER från ett undantagsfilter när undantagstypen förväntas och feladressen är känd. Du bör tillåta att standardfelhanteraren bearbetar oväntade undantagstyper och feladresser.

Exempel 1

Följande kodfragment använder strukturerad undantagshantering för att kontrollera om en divisionsåtgärd på två 32-bitars heltal resulterar i ett division-by-zero-fel. Om detta inträffar returnerar funktionen FALSE, annars returneras 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;
} 

Exempel 2

Följande exempelfunktion anropar funktionen DebugBreak och använder strukturerad undantagshantering för att söka efter ett brytpunktsfel. Om ett inträffar innebär det att undantaget inte hanterades av ett felsökningsprogram, och funktionen returnerar FALSE, annars returneras 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;
}

Exempel 3

I följande exempel visas interaktionen mellan kapslade hanterare. Funktionen RaiseException orsakar ett undantag i den skyddade brödtexten för en avslutningshanterare som finns i den skyddade brödtexten för en undantagshanterare. Undantaget gör att systemet utvärderar funktionen FilterFunction, vars returvärde i sin tur gör att undantagshanteraren anropas. Innan undantagshanterarblocket körs körs dock __finally-blocket för avslutningshanteraren eftersom kontrollflödet har lämnat __try-blocket för avslutningshanteraren.

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