Écrire un filtre d'exception
Vous pouvez gérer une exception en accédant au niveau de gestionnaire d'exceptions ou en reprenant l'exécution.Au lieu d'utiliser le code de gestionnaire d'exceptions pour gérer l'exception et de diminution, vous pouvez utiliser le filtre pour nettoyer le problème puis, en retournant - 1, utilisez le flux normal sans désactiver la pile.
[!REMARQUE]
Certaines exceptions ne peuvent pas être continuées.Si le filtre correspond à 1 de cette exception, le système lève une exception.Lorsque vous appelez RaiseException, vous déterminez si l'exception continue.
Par exemple, le code suivant utilise un appel de fonction dans l'expression de filtre : cette fonction traite le problème puis retourne à 1 pour continuer l'ordre d'exécution normal :
// 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;
}
Il est conseillé d'utiliser un appel de fonction dans l'expression de filtre chaque fois que les besoins de filtre de tout faire complexe.évaluer l'expression provoque l'exécution de la fonction, dans ce cas, Eval_Exception.
notez l'utilisation de GetExceptionCode de déterminer l'exception.Vous devez appeler cette fonction à l'intérieur de le filtre elle-même.Eval_Exception ne peut pas appeler GetExceptionCode, mais il doit avoir un code d'exception qui lui est passé.
Ce gestionnaire passe le contrôle à un autre gestionnaire à moins que l'exception a un entier ou un dépassement de capacité à virgule flottante.Si la valeur est, le gestionnaire appelle une fonction (ResetVars est qu'un exemple, pas une fonction API) pour réinitialiser certaines variables globales.Statement-block-2qui, dans cet exemple est vide, ne peut jamais être exécutée parce qu' Eval_Exception ne retourne jamais EXCEPTION_EXECUTE_HANDLER (1).
À l'aide d'un appel de fonction est une technique à usage général pour le traitement des expressions de filtre complexes.deux autres fonctionnalités de langage C qui sont utiles sont :
l'opérateur conditionnel
L'opérateur virgule
L'opérateur conditionnel est souvent utile, car elle peut être utilisée pour vérifier le code de retour spécifique puis pour retourner une des deux valeurs différentes.Par exemple, le filtre dans le code suivant identifie l'exception uniquement si l'exception est STATUS_INTEGER_OVERFLOW:
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ? 1 : 0 ) {
L'objectif de l'opérateur conditionnel est dans ce cas principalement pour fournir plus de clarté, car le code suivant produit les mêmes résultats :
__except( GetExceptionCode() == STATUS_INTEGER_OVERFLOW ) {
L'opérateur conditionnel est plus utile dans les situations dans lesquelles vous pouvez le filtre pour évaluer - 1, EXCEPTION_CONTINUE_EXECUTION.
L'opérateur virgule vous permet d'effectuer plusieurs opérations indépendantes, dans une expression unique.L'effet est approximativement celui d'exécuter plusieurs instructions puis de retourner la valeur de la dernière expression.Par exemple, le code suivant enregistre le code d'exception dans une variable puis le tester :
__except( nCode = GetExceptionCode(), nCode == STATUS_INTEGER_OVERFLOW )