Eccezioni: generazione di eccezioni da funzioni personalizzate
È possibile usare il paradigma di gestione delle eccezioni MFC esclusivamente per intercettare le eccezioni generate dalle funzioni in MFC o in altre librerie. Oltre a intercettare le eccezioni generate dal codice di libreria, è possibile generare eccezioni dal codice personalizzato se si scrivono funzioni che possono riscontrare condizioni eccezionali.
Quando viene generata un'eccezione, l'esecuzione della funzione corrente viene arrestata e passa direttamente al catch
blocco del frame di eccezione più interno. Il meccanismo di eccezione ignora il normale percorso di uscita da una funzione. Pertanto, è necessario assicurarsi di eliminare i blocchi di memoria che verrebbero eliminati in una normale uscita.
Per generare un'eccezione
Usare una delle funzioni helper MFC, ad esempio
AfxThrowMemoryException
. Queste funzioni generano un oggetto eccezione preallocato del tipo appropriato.Nell'esempio seguente una funzione tenta di allocare due blocchi di memoria e genera un'eccezione se una delle due allocazioni ha esito negativo:
{ 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); }
Se la prima allocazione non riesce, è sufficiente generare l'eccezione di memoria. Se la prima allocazione ha esito positivo ma la seconda ha esito negativo, è necessario liberare il primo blocco di allocazione prima di generare l'eccezione. Se entrambe le allocazioni hanno esito positivo, è possibile procedere normalmente e liberare i blocchi quando si esce dalla funzione.
- oppure-
Usare un'eccezione definita dall'utente per indicare una condizione di problema. È possibile generare un elemento di qualsiasi tipo, anche un'intera classe, come eccezione.
Nell'esempio seguente viene eseguito un tentativo di riprodurre un suono tramite un dispositivo wave e viene generata un'eccezione in caso di errore.
#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; }
Nota
La gestione predefinita di MFC delle eccezioni si applica solo ai puntatori agli oggetti (e agli CException
oggetti delle CException
classi derivate da ). L'esempio precedente ignora il meccanismo di eccezione di MFC.