Gestion des exceptions basées sur des images
Un gestionnaire d’exceptions basé sur un frame vous permet de gérer la possibilité qu’une exception se produise dans une certaine séquence de code. Un gestionnaire d’exceptions basé sur une trame se compose des éléments suivants.
- Un corps de code protégé
- Expression de filtre
- Bloc de gestionnaire d’exceptions
Les gestionnaires d’exceptions basés sur une trame sont déclarés dans la syntaxe propre au langage. Par exemple, dans le compilateur d’optimisation Microsoft C/C++, ils sont implémentés à l’aide de __try et de __except. Pour plus d’informations, consultez Syntaxe du gestionnaire.
Le corps de code protégé est un ensemble d’une ou plusieurs instructions pour lesquelles l’expression de filtre et le bloc de gestionnaire d’exceptions fournissent une protection contre la gestion des exceptions. Le corps protégé peut être un bloc de code, un ensemble de blocs imbriqués ou une procédure ou une fonction entière. À l’aide du compilateur d’optimisation Microsoft C/C++, un corps protégé est entouré d’accolades ({}) qui suivent la mot clé __try.
L’expression de filtre d’un gestionnaire d’exceptions basé sur un frame est une expression qui est évaluée par le système lorsqu’une exception se produit dans le corps protégé. Cette évaluation entraîne l’une des actions suivantes par le système.
- Le système arrête sa recherche d’un gestionnaire d’exceptions, restaure l’état de la machine et poursuit l’exécution du thread au point où l’exception s’est produite.
- Le système poursuit sa recherche d’un gestionnaire d’exceptions.
- Le système transfère le contrôle au gestionnaire d’exceptions, et l’exécution du thread se poursuit séquentiellement dans la trame de pile dans laquelle le gestionnaire d’exceptions se trouve. Si le gestionnaire ne se trouve pas dans le cadre de pile dans lequel l’exception s’est produite, le système déroule la pile, en laissant le frame de pile actuel et les autres trames de pile jusqu’à ce qu’il soit de nouveau dans le cadre de pile du gestionnaire d’exceptions. Avant l’exécution d’un gestionnaire d’exceptions, les gestionnaires d’arrêt sont exécutés pour tous les corps de code surveillés qui se sont arrêtés à la suite du transfert du contrôle vers le gestionnaire d’exceptions. Pour plus d’informations sur les gestionnaires d’arrêt, consultez Gestion des terminaisons.
L’expression de filtre peut être une expression simple ou appeler une fonction de filtre qui tente de gérer l’exception. Vous pouvez appeler les fonctions GetExceptionCode et GetExceptionInformation à partir d’une expression de filtre pour obtenir des informations sur l’exception filtrée. GetExceptionCode retourne un code qui identifie le type d’exception, et GetExceptionInformation retourne un pointeur vers une structure EXCEPTION_POINTERS qui contient des pointeurs vers les structures CONTEXT et EXCEPTION_RECORD .
Ces fonctions ne peuvent pas être appelées à partir d’une fonction de filtre, mais leurs valeurs de retour peuvent être passées en tant que paramètres à une fonction de filtre. GetExceptionCode peut être utilisé dans le bloc de gestionnaire d’exceptions, mais GetExceptionInformation ne peut pas, car les informations vers laquelle il pointe se trouvent généralement sur la pile et sont détruites lorsque le contrôle est transféré vers un gestionnaire d’exceptions. Toutefois, une application peut copier les informations dans un stockage sécurisé pour les rendre disponibles pour le gestionnaire d’exceptions.
L’avantage d’une fonction de filtre est qu’elle peut gérer une exception et retourner une valeur qui entraîne la poursuite de l’exécution du système à partir du point où l’exception s’est produite. Avec un bloc de gestionnaire d’exceptions, en revanche, l’exécution se poursuit séquentiellement à partir du gestionnaire d’exceptions plutôt qu’à partir du point de l’exception.
La gestion d’une exception peut être aussi simple que la détection d’une erreur et la définition d’un indicateur qui sera examiné ultérieurement, l’impression d’un avertissement ou d’un message d’erreur, ou l’exécution d’une autre action limitée. Si l’exécution peut être poursuivie, il peut également être nécessaire de modifier l’état de la machine en modifiant l’enregistrement de contexte. Pour obtenir un exemple de fonction de filtre qui gère une exception d’erreur de page, consultez Utilisation des fonctions de mémoire virtuelle.
La fonction UnhandledExceptionFilter peut être utilisée comme fonction de filtre dans une expression de filtre. Il retourne EXCEPTION_EXECUTE_HANDLER sauf si le processus est débogué, auquel cas il retourne EXCEPTION_CONTINUE_SEARCH.