Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Následující příklady ukazují použití zpracování výjimek.
Některé z příkladů používají funkci GetExceptionCode ve výrazu filtru __except ke kontrole typu výjimky před spuštěním obslužné rutiny. Systém tak může pokračovat v hledání vhodné obslužné rutiny, pokud dojde k nějakému jinému typu výjimky.
Obecně platí, že vrací EXCEPTION_EXECUTE_HANDLER pouze z filtru výjimek, pokud je typ výjimky očekávaný a je známa chybná adresa. Výchozí obslužné rutině pro výjimky byste měli povolit zpracování neočekávaných typů výjimek a selhávajících adres.
Příklad 1
Následující fragment kódu používá strukturované zpracování výjimek ke kontrole, jestli operace dělení na dvou 32bitových celých číslech způsobí chybu dělení po nule. Pokud k tomu dojde, vrátí funkce FALSE, jinak vrátí 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;
}
Příklad 2
Následující příklad volá funkci DebugBreak a používá strukturované zpracování výjimek ke kontrole výjimky zarážky. Pokud k ní dojde, znamená to, že výjimku nezpracoval ladicí program a funkce vrátí FALSE, jinak vrátí 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;
}
Příklad 3
Následující příklad ukazuje interakci vnořených obslužných rutin. Funkce RaiseException způsobí výjimku ve stráženém těle ukončovacího handleru, který je uvnitř stráženého těla výjimkového handleru. Výjimka způsobí, že systém vyhodnotí funkci FilterFunction, jejíž návratová hodnota následně způsobí vyvolání obslužné rutiny výjimky. Před spuštěním bloku obslužné rutiny výjimky se však nejprve spustí blok __finally ukončovací rutiny, protože tok řízení opustil blok __try této rutiny.
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
}
}