Schreiben eines Ausnahme-Filters
Sie können eine Ausnahme behandeln, indem Sie entweder auf das Ausmaß des Ausnahmehandlers wechseln oder die Ausführung fortsetzen.Statt der Ausnahmehandler von Code verwendet werden soll, um die Ausnahme zu behandeln und zu fallen, können Sie Filter verwenden, um das Problem zu bereinigen und anschließend sicher, indem Sie zurückkehren 1, stellen normalen Fluss fortgesetzt, ohne den Stapel zu löschen.
Hinweis |
---|
Einige Ausnahmen können nicht fortgesetzt werden.Wenn Filter ergibt 1 für eine derartige Ausnahme, löst das System eine neue Ausnahme aus.Wenn Sie RaiseExceptionaufrufen, wird bestimmt, ob die Ausnahme fortgesetzt wird. |
Beispielsweise verwendet der folgende Code einen Funktionsaufruf im Filterausdruck : Diese Funktion behandelt das Problem und gibt 1 zurück, um normalen Programmablauf fortzufahren:
// exceptions_Writing_an_Exception_Filter.cpp
#include <windows.h>
int main() {
int Eval_Exception( int );
__try {}
__except ( Eval_Exception( GetExceptionCode( ))) {
;
}
}
void ResetVars( int ) {}
int Eval_Exception ( int n_except ) {
if ( n_except != STATUS_INTEGER_OVERFLOW &&
n_except != STATUS_FLOAT_OVERFLOW ) // Pass on most exceptions
return EXCEPTION_CONTINUE_SEARCH;
// Execute some code to clean up problem
ResetVars( 0 ); // initializes data to 0
return EXCEPTION_CONTINUE_EXECUTION;
}
Sie sollten einen Funktionsaufruf im Filterausdruck verwendet werden soll, sobald alles komplexes Filter ausführen muss.Das Auswerten des Ausdrucks verursacht Ausführung der Funktion in diesem Fall Eval_Exception.
Beachten Sie die Verwendung von GetExceptionCode , die Ausnahme zu bestimmen.Sie müssen diese Funktion innerhalb des Filters selbst aufrufen.Eval_Exception kann GetExceptionCodenicht aufrufen, jedoch muss mit dem angegebenen Ausnahmecode, der an ihn übergeben wird.
Dieser Handler übergibt die Steuerung an eine andere Handler, sofern die Ausnahme eine ganze Zahl oder einen Gleitkommawert Überlauf ist.Wenn dies der Fall ist, ruft der Handler eine Funktion (ResetVars ist nur ein Beispiel für eine API-Funktion) an, um mehrere globale Variablen zurückzusetzen.Statement-block-2, dass in diesem Beispiel leer ist, kann nicht ausgeführt werden, da Eval_Exception nie EXCEPTION_EXECUTE_HANDLER (1) zurückgibt.
Verwenden eines Funktionsaufrufs ist eine gute allgemeine Verfahren für die Behandlung von komplexe Filterausdrücke.Zwei andere Programmiersprache C-Funktionen, die hilfreich sind, sind:
Der bedingte Operator
Der Operator Komma
Der bedingte Operator ist häufig nützlich, da er verwendet werden kann, um für einen bestimmten Rückgabecode zu überprüfen und einen von zwei unterschiedlichen Werten dann zurückzugeben.Zum Beispiel erkennt der Filter im folgenden Code die Ausnahme nur, wenn die Ausnahme STATUS_INTEGER_OVERFLOWist:
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ? 1 : 0 ) {
Der Zweck des bedingten Operators ist in diesem Fall in erster Linie, Klarheit bereitstellen, da der folgende Code stellt die gleichen Ergebnisse:
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ) {
Der bedingte Operator ist in Situationen, in denen Sie den Filter ausgewertet werden sollen, 1, EXCEPTION_CONTINUE_EXECUTION nützlicher.
Der Operator Komma ermöglicht es Ihnen, mehrere unabhängige Vorgänge auszuführen innerhalb eines einzelnen Ausdrucks.Der Effekt ist ungefähr der der Ausführung von mehreren Anweisungen und anschließend den Wert des letzten Ausdrucks zurückgeben.Im folgenden Code wird z. B. den Ausnahmecode in einer Variablen und testet dann auf:
__except( nCode = GetExceptionCode(), nCode == STATUS_INTEGER_OVERFLOW )