Eccezioni: rilevamento ed eliminazione di eccezioni
Le istruzioni e gli esempi seguenti illustrano come intercettare ed eliminare le eccezioni. Per altre informazioni sulle try
parole chiave , catch
e 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 CException
oggetto , 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
Usare la
try
parola chiave per configurare untry
blocco. Eseguire qualsiasi istruzione del programma che potrebbe generare un'eccezione all'interno di untry
blocco.Usare la
catch
parola chiave per configurare uncatch
blocco. Inserire il codice di gestione delle eccezioni in uncatch
blocco. Il codice nelcatch
blocco viene eseguito solo se il codice all'interno deltry
blocco genera un'eccezione del tipo specificato nell'istruzionecatch
.Lo scheletro seguente mostra come
try
ecatch
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 sequenzialicatch
, 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.