Eccezioni: Generare eccezioni dalle funzioni personalizzate
È possibile utilizzare esclusivamente il paradigma di gestione delle eccezioni MFC per intercettare eccezioni generate dalle funzioni in MFC o nelle altre raccolte.Oltre alle eccezioni durante generate dal codice di libreria, è possibile generare le eccezioni del proprio codice se si sta scrivendo le funzioni che possono verificarsi in casi eccezionali.
Quando viene generata un'eccezione, l'esecuzione della funzione corrente viene interrotta e passa direttamente al blocco catch del frame più interno di eccezione.Il meccanismo di eccezione ignora il percorso normale esci da una funzione.Pertanto, è necessario assicurarsi di eliminare i blocchi di memoria che è eliminerebbero in un'uscita normale.
Per generare un'eccezione
Utilizzare una delle funzioni di supporto MFC, come AfxThrowMemoryException.Queste funzioni consentono di generare un oggetto eccezione preassegnato del tipo appropriato.
Nell'esempio seguente, una funzione tenta di allocare due blocchi di memoria e genera un'eccezione se qualsiasi allocazione non riesce:
{ 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, è possibile generare semplicemente l'eccezione di memoria.Se la prima allocazione riesce ma la seconda ha esito negativo, è necessario liberare il primo blocco di allocazione prima di generare l'eccezione.Se entrambe le allocazioni riescono, è possibile proseguire normalmente e liberare blocchi quando si esce dalla funzione.
Oppure
Utilizzare un'eccezione definita dall'utente per indicare uno stato del problema.È possibile generare un elemento di qualsiasi tipo, anche un'intera classe, come eccezione personalizzata.
Nel seguente esempio si tenta di riprodurre un suono da un dispositivo wave e genera un'eccezione se c " è un 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]
I MFC impostazione predefinita la gestione delle eccezioni si applica solo ai puntatori a oggetti di CException (e agli oggetti di CExceptiondi classi derivate).Il meccanismo di eccezione del programma MFC del punto di sopra di esempio.