Condividi tramite


Eccezioni: generazione di eccezioni da funzioni personalizzate

È possibile utilizzare esclusivamente il paradigma di gestione delle eccezioni MFC per intercettare eccezioni generate dalle funzioni in MFC o in altre librerie. Oltre alle eccezioni di intercettazione 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 di Catch del frame più interno di eccezione. Il meccanismo di eccezione ignora il percorso normale dell'uscita da una funzione. Pertanto, è necessario assicurarsi di eliminare i blocchi di memoria che si eliminerebbero di uscita normale.

Per generare un'eccezione

  1. 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 corrispondenza ha esito negativo, è possibile generare semplicemente l'eccezione di memoria. Se la prima corrispondenza ha esito positivo ma la seconda ha esito negativo, è necessario liberare il primo blocco di allocazione prima di generare un'eccezione. Se entrambe le allocazioni riescono, è possibile proseguire normalmente e liberare blocchi quando esce dalla funzione.

     oppure 

  2. Utilizzare un'eccezione definita dall'utente per indicare lo stato del problema. È possibile generare un elemento di qualsiasi tipo, anche un'intera classe, come l'eccezione.

    Nel seguente esempio si tenta di riprodurre un suono da un dispositivo wave e genera un'eccezione se è presente 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

In MFC vengono impostate automaticamente la gestione delle eccezioni si applica solo ai puntatori a oggetti di CException (e agli oggetti di CException- classi derivate.Il meccanismo delle eccezioni ignorate MFC del punto dell'esempio precedente.

Vedere anche

Concetti

Gestione delle eccezioni in MFC