Eccezioni: rilevamento ed eliminazione di eccezioni

Le istruzioni e gli esempi seguenti illustrano come intercettare ed eliminare le eccezioni. Per altre informazioni sulle tryparole chiave , catche throw , vedere Procedure consigliate C++ moderne per le eccezioni e la gestione degli errori.

I gestori di eccezioni devono eliminare gli oggetti eccezione gestiti, perché l'errore di eliminazione dell'eccezione causa una perdita di memoria ogni volta che il codice intercetta un'eccezione.

Il catch blocco deve eliminare un'eccezione quando:

  • Il catch blocco 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();
    }
    
  • L'esecuzione restituisce dall'interno del catch blocco.

Nota

Quando si elimina un CExceptionoggetto , usare la Delete funzione membro per eliminare l'eccezione. Non usare la delete parola chiave perché può non riuscire se l'eccezione non si trova nell'heap.

Per rilevare ed eliminare eccezioni

  1. Usare la try parola chiave per configurare un try blocco. Eseguire qualsiasi istruzione del programma che potrebbe generare un'eccezione all'interno di un try blocco.

    Usare la catch parola chiave per configurare un catch blocco. Inserire il codice di gestione delle eccezioni in un catch blocco. Il codice nel catch blocco viene eseguito solo se il codice all'interno del try blocco genera un'eccezione del tipo specificato nell'istruzione catch .

    Lo scheletro seguente mostra come try e catch i blocchi sono disposti normalmente:

    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 catch blocco la cui dichiarazione di eccezione corrisponde al tipo dell'eccezione. È possibile gestire in modo selettivo diversi tipi di eccezioni con blocchi sequenziali catch , come indicato 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 altre informazioni, vedere Eccezioni: conversione da macro di eccezioni MFC.

Vedi anche

Gestione delle eccezioni