Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Vous pouvez gérer une exception en accédant au niveau du gestionnaire d'exceptions ou en reprenant l'exécution. Au lieu d'utiliser le code du gestionnaire d'exception pour gérer l'exception et tomber à travers, vous pouvez utiliser une expression de filtre pour nettoyer le problème. Ensuite, en renvoyant EXCEPTION_CONTINUE_EXECUTION (-1), vous pouvez reprendre le flux normal sans vider la pile.
Remarque
Certaines exceptions ne peuvent pas être continuées. Si le filtre est évalué à -1 pour une telle exception, le système lève une nouvelle exception. Lorsque vous appelez RaiseException, vous déterminez si l'exception va se poursuivre.
Par exemple, le code suivant utilise un appel de fonction dans l'expression de filtrage : cette fonction traite le problème et renvoie ensuite -1 pour reprendre le flux de contrôle normal :
// exceptions_Writing_an_Exception_Filter.cpp
#include <windows.h>
int Eval_Exception(int);
int main() {
__try {
;
}
__except (Eval_Exception(GetExceptionCode())) {
;
}
}
void HandleOverflow() {
// Gracefully recover
}
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
HandleOverflow();
return EXCEPTION_CONTINUE_EXECUTION;
}
C'est une bonne idée d'utiliser un appel de fonction dans l'expression du filtre chaque fois que le filtre doit faire quelque chose de complexe. L'évaluation de l'expression provoque l'exécution de la fonction, dans ce cas, Eval_Exception.
Notez l'utilisation de GetExceptionCode pour déterminer l'exception. Cette fonction doit être appelée à l'intérieur de l'expression de filtre de l'instruction __except.
Eval_Exception ne peut pas appeler GetExceptionCode, mais le code d'exception doit lui être transmis.
Ce gestionnaire passe le contrôle à un autre gestionnaire sauf si l'exception est un dépassement d'entier ou de virgule flottante. Si c'est le cas, le gestionnaire appelle une fonction (HandleOverflow n'est qu'un exemple, pas une fonction de l'API) pour essayer de récupérer l'exception de manière appropriée. Le bloc d'instructions __except, qui dans cet exemple est vide, ne peut jamais être exécuté car Eval_Exception ne renvoie jamais EXCEPTION_EXECUTE_HANDLER (1).
Utilisation d'un appel de fonction est une bonne technique à usage général pour traiter des expressions de filtre complexes. Il y a deux autres fonctionnalités de langage C utiles :
l'opérateur conditionnel ;
l'opérateur virgule ;
L'opérateur conditionnel est souvent utile ici. Il peut être utilisé pour vérifier la présence d'un code de retour spécifique et renvoyer ensuite l'une des deux valeurs différentes. Par exemple, le filtre du code suivant ne reconnaît l'exception que si celle-ci est STATUS_INTEGER_OVERFLOW:
__except (GetExceptionCode() == STATUS_INTEGER_OVERFLOW ? 1 : 0)
Dans ce cas, l'objectif de l'opérateur conditionnel consiste principalement à assurer la 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 où vous souhaitez que le filtre évalue -1, EXCEPTION_CONTINUE_EXECUTION.
L'opérateur virgule vous permet d'exécuter plusieurs expressions en séquence. Il renvoie ensuite la valeur de la dernière expression. Par exemple, le code suivant enregistre le code d'exception dans une variable puis le teste :
__except (nCode = GetExceptionCode(), nCode == STATUS_INTEGER_OVERFLOW)
Voir aussi
Écrire un gestionnaire d’exceptions
Gestion des exceptions structurées (C/C++)