Partager via


Exceptions : lever des exceptions à vos propres fonctions

Il est possible d'utiliser le modèle de gestion des exceptions MFC uniquement pour intercepter des exceptions levées par des fonctions à MFC ou à d'autres bibliothèques.Outre l'interception d'exceptions levées par le code de bibliothèque, vous pouvez lever des exceptions à votre propre code si vous écrivez des fonctions qui peuvent rencontrer des conditions exceptionnelles.

Lorsqu'une exception est levée, l'exécution de la fonction active est arrêtée et accède directement au bloc de catch du frame le plus profond d'exception.Le mécanisme d'exception ignore le chemin normal de sortie d'une fonction.Par conséquent, vous devez être sûr de supprimer ces blocs de mémoire qui seront supprimés dans une sortie normale.

Pour lever une exception

  1. Utilisez l'une des fonctions d'assistance MFC, telles que AfxThrowMemoryException.Ces fonctions lèvent un objet exception préaffecté du type approprié.

    Dans l'exemple suivant, des tests d'une fonction pour allouer deux blocs de mémoire et lève une exception si l'un ou l'autre d'allocation échoue :

    {
        char* p1 = (char*)malloc( SIZE_FIRST );
        if( p1 == NULL )
            AfxThrowMemoryException();
        char* p2 = (char*)malloc( SIZE_SECOND );
        if( p2 == NULL )
        {
            free( p1 );
            AfxThrowMemoryException();
        }
    
        // ... Do something with allocated blocks ...
    
        // In normal exit, both blocks are deleted.
        free( p1 );
        free( p2 );
    }
    

    Si la première allocation échoue, vous pouvez simplement lever l'exception de mémoire.Si la première allocation est réussie mais le second échoue, vous devez libérer le premier bloc d'allocation avant de lever l'exception.Si les deux allocations réussissent, vous pouvez poursuivre normalement et libérer les blocs en quittant la fonction.

     - ou - 

  2. Utilisez une exception définie par l'utilisateur pour indiquer un état des problèmes.Vous pouvez lever un élément de n'importe quel type, même une classe entière, comme votre exception.

    Les exemple suivant tente de lire un son via un appareil et à celle-ci d'.wav une exception si un échec.

    #define WAVE_ERROR -5
    {
       // This Win32 API returns 0 if the sound cannot be played.
       // Throw an integer constant if it fails.
       if( !PlaySound(_T("SIREN.WAV"), NULL, SND_ASYNC) )
          throw WAVE_ERROR;
    }
    

[!REMARQUE]

La gestion par défaut MFC des exceptions s'applique uniquement aux pointeurs vers des objets d' CException (et aux objets d' CExceptionclasses dérivées de).L'exemple au-dessus de le mécanisme de l'exception MFC ignore.

Voir aussi

Concepts

Gestion des exceptions dans MFC