Condividi tramite


Eccezioni: conversione da macro eccezioni MFC

Si tratta di un argomento avanzato.

In questo articolo viene illustrato come convertire il codice esistente scritto con le macro MFC - PROVA, CATCH, THROW e così via, per utilizzare le parole chiave Prova, Catch e 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 è probabilmente necessario convertire il codice esistente, anche se è 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 vengono trattate 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 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, mobile, char, e così via), sebbene 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 "automaticamente eliminato" un'eccezione rilevata quando viene generata dall'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 è diverso in tre aspetti:

  1. Macro argomenti e le dichiarazioni di un'eccezione:

    Una chiamata di macro di CATCH con la seguente sintassi:

    CATCH( exception_class, 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:

    catch( exception_type exception_name**)**

    Questa istruzione di dichiarazione di eccezione indica il tipo di eccezione che il 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 avviare macro di AND_CATCH e le 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 il generare nuovamente di THROW_LAST l'eccezione corrente. La parola chiave di throw, senza argomenti, ha lo stesso effetto.

Effettuare 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 PROVA, CATCH, AND_CATCH, END_CATCH, THROW e THROW_LASTMFC.

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

    PROVA (Sostituirlo con Prova)

    CATCH (Sostituirlo con Catch)

    AND_CATCH (sostituirlo con Catch)

    END_CATCH (elimina)

    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 da eliminare in base alle esigenze gli oggetti exception. Per ulteriori informazioni, vedere l'articolo Eccezioni: Rilevazione e l'eliminazione delle eccezioni.

Di seguito è riportato un esempio di codice di gestione delle eccezioni utilizzando le macro di eccezione MFC. Si noti che poiché 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