Eccezioni: Versione degli oggetti delle eccezioni
Questo articolo illustra il necessario e il metodo di liberare degli oggetti quando si verifica un'eccezione.Gli argomenti trattati includono
Gestisce l'eccezione in locale
Generazione di eccezioni dopo avere eliminato gli oggetti
Le eccezioni generate dal framework o dall'applicazione interrompere il normale flusso di programma.Pertanto, è molto importante mantenere la barra di avanzamento vicina degli oggetti in modo da poter correttamente per l'utente nel caso venga generata un'eccezione.
Esistono due metodi principali per questo scopo.
Le eccezioni in locale utilizzando le parole chiave di catch e di try , quindi elimina tutti gli oggetti con un'istruzione.
Eliminare qualsiasi oggetto nel blocco catch prima di generare l'eccezione all'esterno del blocco per altre operazioni di gestione.
Questi due approcci vengono illustrati di seguito come soluzioni all'esempio seguente problematico:
void SomeFunc() // Problematic code
{
CPerson* myPerson = new CPerson;
// Do something that might throw an exception.
myPerson->SomeFunc();
// Now destroy the object before exiting.
// If SomeFunc above throws an exception this code will
// not be reached and myPerson will not be deleted.
delete myPerson;
}
Come scritto su, myPerson non verrà eliminato se un'eccezione viene generata da SomeFunc.L'esecuzione passa direttamente al gestore di eccezioni esterno seguente, ignorando l'uscita di funzione normale e il codice che elimina l'oggetto.Il puntatore all'oggetto esce dall'ambito quando l'eccezione della funzione e la memoria occupata dall'oggetto non sarà recuperata mai finché il programma.Si tratta di una perdita di memoria, viene rilevata utilizzando la diagnostica della memoria.
Gestisce l'eccezione in locale
Il paradigma di try/catch fornisce un metodo di programmazione difensivo per evitare la perdita di memoria e assicurarsi che gli oggetti eliminati quando le eccezioni che si verificano.Ad esempio, nell'esempio illustrato precedentemente in questo articolo potrebbe essere riscritto come segue:
void SomeFunc()
{
CPerson* myPerson = new CPerson;
try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
// Handle the exception locally
e->Delete();
}
// Now destroy the object before exiting.
delete myPerson;
}
Questo nuovo esempio è installato un gestore di eccezioni per rilevare l'eccezione e per gestirla localmente.Quindi uscire dalla funzione normalmente e elimina l'oggetto.Aspetto importante di questo esempio è che un contesto per rilevare l'eccezione viene stabilito con blocchi try/catch.Senza un frame locale di eccezione, la funzione non saprebbe mai in cui si informa che è stata generata e non avrebbe avuto la probabilità chiudere normalmente e eliminare l'oggetto.
Generazione di eccezioni dopo avere eliminato gli oggetti
Un altro modo per gestire le eccezioni è di passarli al contesto esterno seguente di gestione delle eccezioni.Nel blocco catch, è possibile eseguire una certa pulitura degli oggetti in locale allocati e quindi generare un'eccezione su per l'ulteriore elaborazione.
La funzione che genera può avere l'esigenza di rimuovere gli oggetti dell'heap.Se la funzione libera sempre l'oggetto dell'heap prima di restituire nel normale, la funzione inoltre necessario rilasciare l'oggetto dell'heap prima di generare l'eccezione.Di altra parte, se la funzione in genere non rilascia l'oggetto prima di restituire nel normale, è necessario decidere caso per caso l'oggetto dell'heap deve essere rilasciato.
Nell'esempio seguente viene illustrato quanto gli oggetti in locale allocati possono essere puliti:
void SomeFunc()
{
CPerson* myPerson = new CPerson;
try
{
// Do something that might throw an exception.
myPerson->SomeFunc();
}
catch( CException* e )
{
e->ReportError();
// Destroy the object before passing exception on.
delete myPerson;
// Throw the exception to the next handler.
throw;
}
// On normal exits, destroy the object.
delete myPerson;
}
Il meccanismo di eccezione viene rilasciata automaticamente dagli oggetti del frame, il distruttore dell'oggetto frame viene chiamato.
Se si chiama le funzioni che possono generare eccezioni, è possibile utilizzare i blocchi try/catch per assicurarsi che di rilevare eccezioni e che disponga di una probabilità eliminare tutti gli oggetti creati.In particolare, tenere presente che molte funzioni MFC possono generare eccezioni.
Per ulteriori informazioni, vedere eccezioni: Rilevazione e l'eliminazione delle eccezioni.