Partager via


Exceptions : interception et suppression d'exceptions

Les instructions et exemples suivants vous montrent comment intercepter et supprimer des exceptions. Pour plus d’informations sur les mots clés try, catch et throw, consultez les meilleures pratiques modernes en C++ pour les exceptions et la gestion des erreurs.

Vos gestionnaires d’exceptions doivent supprimer les objets d’exception qu’ils gèrent, car l’échec de la suppression de l’exception provoque une fuite de mémoire chaque fois que ce code intercepte une exception.

Votre catch bloc doit supprimer une exception lorsque :

  • Le bloc catch lève une nouvelle exception.

    Bien sûr, vous ne devez pas supprimer l’exception si vous lèvez à nouveau la même exception :

    catch (CException* e)
    {
       if (m_bThrowExceptionAgain)
          throw; // Do not delete e
       else
          e->Delete();
    }
    
  • L’exécution retourne depuis le bloc catch.

Remarque

Lors de la suppression d’un CException, utilisez la Delete fonction membre pour supprimer l’exception. N’utilisez pas le mot clé delete, car il peut échouer si l’exception n’est pas sur le tas.

Pour intercepter et supprimer des exceptions

  1. Utilisez le try mot-clé pour configurer un try bloc. Exécutez les instructions de programme qui pourraient lever une exception dans un bloc try.

    Utilisez le catch mot-clé pour configurer un catch bloc. Placez le code de gestion des exceptions dans un catch bloc. Le code du catch bloc est exécuté uniquement si le code dans le try bloc lève une exception du type spécifié dans l’instruction catch .

    Le squelette suivant montre comment les blocs try et catch sont normalement organisés :

    try
    {
       // Execute some code that might throw an exception.
       AfxThrowUserException();
    }
    catch (CException* e)
    {
       // Handle the exception here.
       // "e" contains information about the exception.
       e->Delete();
    }
    

    Lorsqu’une exception est levée, le contrôle passe au premier catch bloc dont la déclaration d’exception correspond au type de l’exception. Vous pouvez gérer de manière sélective différents types d’exceptions avec des blocs séquentiels catch , comme indiqué ci-dessous :

    try
    {
       // Execute some code that might throw an exception.
       AfxThrowUserException();
    }
    catch (CMemoryException* e)
    {
       // Handle the out-of-memory exception here.
       e->Delete();
    }
    catch (CFileException* e)
    {
       // Handle the file exceptions here.
       e->Delete();
    }
    catch (CException* e)
    {
       // Handle all other types of exceptions here.
       e->Delete();
    }
    

Pour plus d’informations, consultez Exceptions : Conversion à partir de macros d’exception MFC.

Voir aussi

gestion des exceptions