Megosztás a következőn keresztül:


Kivételkezelő használata

Az alábbi példák egy kivételkezelő használatát mutatják be.

Néhány példa a __except szűrőkifejezésben található GetExceptionCode függvénnyel ellenőrzi a kivétel típusát a kezelő végrehajtása előtt. Ez lehetővé teszi, hogy a rendszer folytassa a megfelelő kezelő keresését, ha más típusú kivétel történik.

Általában csak akkor ad vissza EXCEPTION_EXECUTE_HANDLER egy kivételszűrőből, ha a kivétel típusa várható, és a hibás cím ismert. Engedélyeznie kell, hogy az alapértelmezett kivételkezelő feldolgozhassa a váratlan kivételtípusokat és a hibás címeket.

1. példa

Az alábbi kódrészlet strukturált kivételkezeléssel ellenőrzi, hogy egy 32 bites egész számon végzett osztási művelet nulladik osztási hibát eredményez-e. Ha ez történik, a függvény HAMISad vissza – ellenkező esetben IGAZ.

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. példa

Az alábbi példafüggvény meghívja a DebugBreak függvényt, és strukturált kivételkezeléssel ellenőrzi a töréspont-kivételeket. Ha ilyen történik, az azt jelenti, hogy a kivételt nem egy hibakereső kezelte, és a függvény HAMIS értéket ad vissza, ellenkező esetben igaz értéket ad vissza.

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. példa

Az alábbi példa a beágyazott kezelők interakcióját mutatja be. A RaiseException függvény kivételt okoz egy olyan befejező kezelő védett törzsében, amely egy másik kivételkezelő védett törzsébe van ágyazva. A kivétel miatt a rendszer kiértékeli a FilterFunction függvényt, amelynek visszatérési értéke viszont a kivételkezelő meghívását eredményezi. A kivételkezelő blokk végrehajtása előtt azonban a rendszer végrehajtja a végpontkezelő __finally blokkját, mert a vezérlési folyamat elhagyta a végpontkezelő __try blokkját.

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