Condividi tramite


Eccezioni: utilizzo di macro MFC ed eccezioni C++

In questo articolo viene illustrato considerazioni per scrivere 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 combinare le macro MFC le parole chiave delle eccezioni C++ nello stesso blocco perché macro eliminano gli oggetti exception automaticamente quando escono di ambito, mentre il codice utilizzando le parole chiave di gestione delle eccezioni non è possibile. Per ulteriori informazioni, vedere l'articolo Eccezioni: Rilevazione e l'eliminazione delle eccezioni.

La differenza principale tra le macro e le parole chiave delle macro "automaticamente" delete un'eccezione rilevata quando viene generata dall'ambito. Il codice utilizzando le parole chiave non fa; le eccezioni individuate in un blocco catch devono eliminata esplicitamente. 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 un'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 l'esecuzione esce dal blocco "" interno di CATCH. L'utilizzo della macro di THROW_LAST anziché l'istruzione di THROW causerà il blocco "extern" di CATCH 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 di Prova presente in un blocco di 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.

Vedere anche

Concetti

Gestione delle eccezioni in MFC