Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Les exemples suivants illustrent l’utilisation d’un gestionnaire d’exceptions.
Certains exemples utilisent la fonction GetExceptionCode dans l’expression de filtre __except pour vérifier le type d’exception avant d’exécuter le gestionnaire. Cela permet au système de poursuivre sa recherche d’un gestionnaire approprié si un autre type d’exception se produit.
En règle générale, retournez uniquement EXCEPTION_EXECUTE_HANDLER à partir d’un filtre d’exception lorsque le type d’exception est attendu et que l’adresse d’erreur est connue. Vous devez autoriser le gestionnaire d’exceptions par défaut à traiter les types d’exceptions inattendus et les adresses d’erreur.
Exemple 1
Le fragment de code suivant utilise la gestion structurée des exceptions pour vérifier si une opération de division sur deux entiers 32 bits entraîne une erreur de division par zéro. Si cela se produit, la fonction retourne FALSE ; sinon, elle retourne 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;
}
Exemple 2
L’exemple de fonction suivant appelle la fonction DebugBreak et utilise la gestion structurée des exceptions pour rechercher une exception de point d’arrêt. Si l’un d’eux se produit, cela signifie que l’exception n’a pas été gérée par un débogueur et que la fonction retourne FALSE ; sinon, elle retourne TRUE.
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;
}
Exemple 3
L’exemple suivant montre l’interaction des gestionnaires imbriqués. La fonction RaiseException provoque une exception dans le corps protégé d'un gestionnaire de terminaison qui se trouve à l’intérieur du corps protégé d'un gestionnaire d'exceptions. L’exception amène le système à évaluer la fonction FilterFunction, dont la valeur de retour à son tour entraîne l’appel du gestionnaire d’exceptions. Toutefois, avant l’exécution du bloc de gestionnaire d’exceptions, le bloc __finally du gestionnaire d’arrêt est exécuté, car le flux du contrôle a laissé le bloc __try du gestionnaire d’arrêt.
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
}
}