Exceptions : levée d'exceptions à partir de vos propres fonctions
Il est possible d’utiliser le paradigme de gestion des exceptions MFC uniquement pour intercepter les exceptions levées par des fonctions dans MFC ou d’autres bibliothèques. En plus d’intercepter les exceptions levées par le code de bibliothèque, vous pouvez lever des exceptions à partir de 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 actuelle est arrêtée et passe directement au catch
bloc de la trame d’exception la plus interne. Le mécanisme d’exception contourne le chemin de sortie normal d’une fonction. Par conséquent, vous devez être sûr de supprimer ces blocs de mémoire qui seraient supprimés dans une sortie normale.
Pour lever une exception
Utilisez l’une des fonctions d’assistance MFC, telles que
AfxThrowMemoryException
. Ces fonctions lèvent un objet d’exception préalloué du type approprié.Dans l’exemple suivant, une fonction tente d’allouer deux blocs de mémoire et lève une exception en cas d’échec de l’allocation :
{ 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 réussit mais que la deuxième échoue, vous devez libérer le premier bloc d’allocation avant de lever l’exception. Si les deux allocations réussissent, vous pouvez continuer normalement et libérer les blocs lors de la sortie de la fonction.
- ou -
Utilisez une exception définie par l’utilisateur pour indiquer une condition de problème. Vous pouvez lever un élément de n’importe quel type, même une classe entière, comme exception.
L’exemple suivant tente de lire un son par le biais d’un appareil à ondes et lève une exception en cas de défaillance.
#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 des exceptions de MFC s’applique uniquement aux pointeurs vers CException
des objets (et des objets de classes dérivées de CException
-). L’exemple ci-dessus contourne le mécanisme d’exception de MFC.