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 bonnes pratiques relatives aux exceptions et throw aux mot clé, consultez les meilleures pratiques modernes en C++ pour la trycatchgestion des exceptions et 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 catch bloc 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 à partir du catch bloc.

Remarque

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

Pour intercepter et supprimer des exceptions

  1. Utilisez la try mot clé pour configurer un try bloc. Exécutez les instructions de programme susceptibles de lever une exception dans un try bloc.

    Utilisez la 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 et catch les try blocs 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