Verwenden eines Ausnahmehandlers
In den folgenden Beispielen wird die Verwendung eines Ausnahmehandlers veranschaulicht.
Beispiel 1
Das folgende Codefragment verwendet eine strukturierte Ausnahmebehandlung, um zu überprüfen, ob ein Divisionsvorgang für zwei 32-Bit-Ganzzahlen zu einem Division-by-Zero-Fehler führt. In diesem Fall gibt die Funktion FALSE zurück, andernfalls 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;
}
Beispiel 2
Die folgende Beispielfunktion ruft die DebugBreak-Funktion auf und verwendet die strukturierte Ausnahmebehandlung, um nach einer Breakpointausnahme zu suchen. Wenn ein Fehler auftritt, gibt die Funktion FALSE zurück. Andernfalls wird TRUE zurückgegeben.
Der Filterausdruck im Beispiel verwendet die GetExceptionCode-Funktion, um den Ausnahmetyp vor dem Ausführen des Handlers zu überprüfen. Dadurch kann das System die Suche nach einem geeigneten Handler fortsetzen, wenn ein anderer Ausnahmetyp auftritt.
Außerdem unterscheidet sich die Verwendung der return-Anweisung im _ _ try-Block eines Ausnahmehandlers von der Verwendung von return im _ _ try-Block eines Beendigungshandlers, der eine ungewöhnliche Beendigung des _ _ try-Blocks verursacht. Dies ist eine gültige Verwendung der return-Anweisung in einem Ausnahmehandler.
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;
}
Gibt EXCEPTION EXECUTE HANDLER nur _ _ dann von einem Ausnahmefilter zurück, wenn der Ausnahmetyp erwartet wird und die Fehleradresse bekannt ist. Sie sollten zulassen, dass der Standardausnahmehandler unerwartete Ausnahmetypen und Fehleradressen verarbeitet.
Beispiel 3
Das folgende Beispiel zeigt die Interaktion von geschachtelten Handlern. Die RaiseException-Funktion löst eine Ausnahme im geschützten Text eines Beendigungshandlers aus, der sich im geschützten Text eines Ausnahmehandlers befindet. Die Ausnahme bewirkt, dass das System die FilterFunction-Funktion auswertet, deren Rückgabewert wiederum dazu führt, dass der Ausnahmehandler aufgerufen wird. Bevor jedoch der Ausnahmehandlerblock ausgeführt wird, wird der _ _ finally-Block des Beendigungshandlers ausgeführt, da der Ablauf der Steuerung 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
}
}