Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
}
}