Condividi tramite


Eccezioni: Rilevazione e eliminazione delle eccezioni

Le seguenti istruzioni ed esempi viene illustrato come rilevare ed eliminare le eccezioni.Per ulteriori informazioni su try, catchle parole chiave e di throw , vedere Gestione delle eccezioni C++.

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

Il blocco catch necessario eliminare un'eccezione quando:

  • Il blocco catch genera una nuova eccezione.

    Naturalmente, non è necessario eliminare l'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 catch.

[!NOTA]

Quando si elimina CException, utilizzare la funzione membro di Elimina per eliminare l'eccezione.Non utilizzare la parola chiave di delete , poiché può non riuscire se l'eccezione non è nell'heap.

Per intercettare l'eccezione ed eliminare le eccezioni

  • Utilizzare la parola chiave di try per impostare un blocco try.Eseguire le istruzioni di programma che potrebbe generare un'eccezione all'interno di un blocco try.

    Utilizzare la parola chiave di catch per impostare un blocco catch.Codice di gestione delle eccezioni del posto in un blocco catch.Il codice nel blocco catch viene eseguito solo se il codice nel blocco try genera un'eccezione di tipo specificato nell'istruzione catch.

    Di seguito viene illustrato lo scheletro come try e i blocchi 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 catch di cui la dichiarazione dell'eccezione corrisponde al tipo dell'eccezione.È possibile gestire in modo selettivo i diversi tipi di eccezioni con blocchi catch sequenziali come illustrato 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