Condividi tramite


Eccezioni: rilevamento ed eliminazione di eccezioni

Le seguenti istruzioni ed esempi viene mostrato come intercettare ed eliminare le eccezioni. Per ulteriori informazioni su Prova, Catch e le parole chiave di throw, vedere Gestione delle eccezioni C++.

I gestori di eccezioni devono eliminare gli oggetti exception che gestiscono, poiché l'omissione di eliminare l'eccezione causa una perdita di memoria ogni volta che tale codice intercetta un'eccezione.

Il blocco di Catch deve eliminare un'eccezione quando:

  • Il blocco di Catch genera una nuova eccezione.

    Naturalmente, non è necessario eliminare eccezione se si genera nuovamente la stessa eccezione:

    catch(CException* e)
    {
       if (m_bThrowExceptionAgain)
          throw; // Do not delete e 
       else 
          e->Delete();
    }
    
  • Restituzione di esecuzione dall'interno del blocco di Catch.

Nota

Nell'eliminare CException, utilizzare la funzione membro di Elimina per eliminare l'eccezione.Non utilizzare la parola chiave di eliminazione, poiché può non riuscire se l'eccezione non si trova sull'heap.

Per individuare ed eliminare le eccezioni

  • Utilizzare la parola chiave di Prova per installare un blocco di Prova. Eseguire le istruzioni del programma che potrebbero generare un'eccezione all'interno di un blocco di Prova.

    Utilizzare la parola chiave di Catch per installare un blocco di Catch. Codice di gestione delle eccezioni del posto di un blocco di Catch. Il codice nel blocco di Catch viene eseguito solo se il codice all'interno del blocco di Prova genera un'eccezione di tipo specificato nell'istruzione di Catch.

    Illustrato lo scheletro come Prova e i blocchi di Catch in genere vengono disposti:

    try
    {
       // Execute some code that might throw an exception.
       AfxThrowUserException();
    }
    catch( CException* e )
    {
       // Handle the exception here. 
       // "e" contains information about the exception.
       e->Delete();
    }
    

    Quando viene generata un'eccezione, il controllo passa al primo blocco di Catch di cui la dichiarazione dell'eccezione corrisponde al tipo dell'eccezione. È possibile gestire in modo selettivo i diversi tipi di eccezioni con i blocchi sequenziali di Catch elencato di seguito:

    try
    {
       // Execute some code that might throw an exception.
       AfxThrowUserException();
    }
    catch( CMemoryException* e )
    {
       // Handle the out-of-memory exception here.
       e->Delete();
    }
    catch( CFileException* e )
    {
       // Handle the file exceptions here.
       e->Delete();
    }
    catch( CException* e )
    {
       // Handle all other types of exceptions here.
       e->Delete();
    }
    

Per ulteriori informazioni, vedere Eccezioni: Conversione da macro di eccezione MFC.

Vedere anche

Concetti

Gestione delle eccezioni in MFC