Eccezioni: Utilizzando le macro MFC e delle eccezioni C++
In questo articolo viene illustrato considerazioni per scrivere il codice che utilizza sia le macro di gestione delle eccezioni MFC che le parole chiave di gestione delle eccezioni C++.
Questo articolo vengono trattati i seguenti argomenti:
Parole chiave e macro di eccezione di combinazione
Blocco try nei blocchi catch
Parole chiave e macro di eccezione di combinazione
È possibile combinare parole chiave di macro di eccezione MFC e delle eccezioni C++ nello stesso programma.Ma non è possibile mischiare le macro MFC le parole chiave delle eccezioni C++ nello stesso blocco perché macro eliminare gli oggetti eccezione automaticamente quando escono dall'ambito, mentre il codice utilizzando le parole chiave di gestione delle eccezioni contrario.Per ulteriori informazioni, vedere l'articolo eccezioni: Rilevazione e l'eliminazione delle eccezioni.
La differenza principale tra le macro e le parole chiave è che le macro “automatically„ delete " un'eccezione rilevata quando l'eccezione non rientra più nell'ambito.Il codice utilizzando le parole chiave non fa; le eccezioni rilevate in un blocco catch devono eliminare in modo esplicito.Le macro di combinazione e parole chiave delle eccezioni C++ possono causare perdite di memoria a un oggetto eccezione non viene eliminato, o il danneggiamento dell'heap quando un'eccezione viene eliminato due volte.
Il codice seguente, ad esempio, invalida il puntatore di eccezione:
TRY
{
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e) // The "inner" catch block
{
throw; // Invalid attempt to throw exception
// to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e) // The "outer" catch block
{
// Pointer e is invalid because
// it was deleted in the inner catch block.
}
END_CATCH
Il problema si verifica perché e eliminato quando esce dal blocco catch “interno„.Utilizzando la macro di THROW_LAST anziché l'istruzione di THROW modo il blocco catch “extern„ a ricevere un puntatore valido:
TRY
{
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e) // The "inner" catch block
{
THROW_LAST(); // Throw exception to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e) // The "outer" catch block
{
// Pointer e is valid because
// THROW_LAST() was used.
}
END_CATCH
Blocco try nei blocchi catch
Non è possibile generare nuovamente l'eccezione corrente dall'interno di un blocco try presente in un blocco catch.Nell'esempio non è valido:
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
try
{
throw; // Wrong. Causes e (the exception
// being thrown) to be deleted.
}
catch(CException* exception)
{
exception->ReportError();
}
}
END_CATCH
Per ulteriori informazioni, vedere eccezioni: Indice esame di eccezione.