exceptions : lever des exceptions à vos propres fonctions
Il est possible d'utiliser le paradigme de gestion des exceptions de MFC uniquement pour intercepter les exceptions levées par les fonctions de MFC ou d'autres bibliothèques. En plus d'attraper les exceptions levées par le code de bibliothèque, vous pouvez lever des exceptions dans votre propre code lorsque vous entrez des fonctions qui peuvent rencontrer des conditions exceptionnelles.
Lorsqu'une exception est levée, l'exécution de la fonction en cours est arrêté et accède directement au bloc catch du cadre le plus interne de l'exception. Le mécanisme d'exception ignore le chemin d'accès normal de résultat d'une fonction. Par conséquent, vous devez vous assurer de supprimer ces blocs de mémoire qui seraient supprimés dans une sortie normale.
Lever une exception.
Utilisez l'une des fonctions d'assistance de MFC, telles que AfxThrowMemoryException. Ces fonctions lèvent un objet exception préaffecté du type approprié.
Dans l'exemple suivant, une fonction tente d'allouer deux blocs de mémoire et lève une exception si l'une des allocations é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 réussit mais la seconde é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 en quittant la fonction.
- ou -
Utilisez une exception définie par l'utilisateur pour afficher l'état du problème. Vous pouvez générer un élément de n'importe quel type, même une classe entière, comme exception.
L'exemple suivant tente de jouer un son via un périphérique et lève une exception si il y a un problème.
#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; }
Notes
La gestion par défaut de MFC des exceptions s'applique uniquement aux pointeurs aux objets CException (et aux objets de classes dérivées de CException).L'exemple ci-dessus outrepasse le mécanisme d'exception MFC.