Eccezioni: Conversione da macro di eccezione MFC

Si tratta di un argomento avanzato.

In questo articolo viene illustrato come convertire il codice esistente scritto con le macro di MFC — TRY, CATCH, THROWe così via, per utilizzare le parole chiave try, catche throwdi gestione delle eccezioni C++.Gli argomenti trattati includono

  • Vantaggi di conversione

  • Conversione del codice con le macro di eccezione per utilizzare le eccezioni C++

Vantaggi di conversione

Non sarà probabilmente necessario convertire il codice esistente, sebbene sia opportuno conoscere le differenze tra le macro implementazioni in MFC versione 3,0 e le implementazioni nelle versioni precedenti.Queste differenze e successive modifiche apportate al comportamento di codice sono descritte in eccezioni: Modifiche alle macro di eccezione nella versione 3,0.

I principali vantaggi di conversione sono:

  • Il codice che utilizza le parole chiave di gestione delle eccezioni C++ viene compilato in un file EXE o a DLL leggermente più piccolo.

  • Le parole chiave di gestione delle eccezioni C++ sono più versatili: Possono gestire le eccezioni di qualsiasi tipo di dati che possono essere copiate (int, float, char, e così via), mentre le macro gestiscono le eccezioni solo di classe CException e delle classi derivate da.

La differenza principale tra le macro e le parole chiave del codice utilizzando le macro “automatically„ elimina un'eccezione rilevata quando l'eccezione non rientra più nell'ambito.Il codice utilizzando le parole chiave contrario, pertanto è necessario eliminare in modo esplicito un'eccezione intercettata.Per ulteriori informazioni, vedere l'articolo eccezioni: Rilevazione e l'eliminazione delle eccezioni.

Un'altra differenza consiste sintassi.La sintassi per le macro e le parole chiave differiscono in tre aspetti:

  1. Macro argomenti e dichiarazioni di eccezione:

    Una chiamata di macro di CATCH con la seguente sintassi:

    exception_class diCATCH(, exception_object_pointer_name**)**

    Si noti la virgola tra il nome della classe e il nome del puntatore all'oggetto.

    La dichiarazione di eccezione per la parola chiave di catch utilizza questa sintassi:

    exception_typeexception_name**)dicatch(**

    Questa istruzione di dichiarazione di eccezione indica il tipo di eccezione l'handle del blocco catch.

  2. Delimitazione dei blocchi catch:

    Con le macro, la macro di CATCH (con i relativi argomenti) inizia il primo blocco catch; i blocchi catch successivi di inizio di macro di AND_CATCH e la macro di END_CATCH termina la sequenza di blocchi catch.

    Con parole chiave, la parola chiave di catch (con la dichiarazione di eccezione) avvia ogni blocco catch.Non esiste alcuna controparte alla macro di END_CATCH ; il blocco catch termina con la parentesi graffa di chiusura.

  3. L'espressione throw:

    Le macro utilizzano ad eccezione di THROW_LAST l'eccezione corrente.La parola chiave di throw , senza argomenti, ha lo stesso effetto.

Eseguire la conversione

Per convertire codice utilizzando le macro per utilizzare le parole chiave di gestione delle eccezioni C++

  1. Individuare tutte le occorrenze delle macro TRY, CATCH, AND_CATCH, END_CATCH, THROWe THROW_LASTMFC.

  2. Sostituire o eliminare tutte le occorrenze di macro seguenti:

    TRY (sostituirlo con try)

    CATCH (sostituirlo con catch)

    AND_CATCH (sostituirlo con catch)

    END_CATCH (delete)

    THROW (sostituirlo con throw)

    THROW_LAST (sostituirlo con throw)

  3. Modificare la macro argomenti in modo che formino le dichiarazioni valide di eccezione.

    Ad esempio, modifica

    CATCH(CException, e)
    

    in

    catch(CException* e)
    
  4. Modificare il codice nei blocchi catch in modo che abbia eliminato in base alle esigenze gli oggetti eccezione.Per ulteriori informazioni, vedere l'articolo eccezioni: Rilevazione e l'eliminazione delle eccezioni.

Di seguito è riportato un esempio di codice per la gestione delle eccezioni utilizzando le macro di eccezione MFC.Si noti che in quanto il codice nell'esempio vengono utilizzate le macro, l'eccezione e viene eliminato automaticamente:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();

   if (m_bReturnFromThisFunction)
      return;

   // Not necessary to delete the exception e.
}
END_CATCH

Il codice nell'esempio seguente vengono utilizzate le parole chiave delle eccezioni C++, pertanto eccezione venga eliminata esplicitamente:

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch(CException* e)
{
   if (m_bPassExceptionsUp)
      throw;

   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }

   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }

   e->Delete();
}

Per ulteriori informazioni, vedere eccezioni: Utilizzando le macro MFC e delle eccezioni C++.

Vedere anche

Concetti

Gestione delle eccezioni in MFC