Sdílet prostřednictvím


Výjimky: Převádění z maker výjimek prostředí MFC

Toto je rozšířená.

Tento článek popisuje, jak převést existující kód napsaný s makra Microsoft Foundation Class – akci, SKUTEČNÉ, VYVOLATa tak dále – použít klíčová slova zpracování výjimek C++ akci, skutečné, a throw.Témata zahrnují:

  • Výhody převodu

  • Převod kódu makra výjimky pro použití výjimky C++

Výhody převodu

Pravděpodobně nepotřebujete k převedení existujícího kódu, i když je třeba si uvědomit rozdíly mezi implementacemi makro v MFC verze 3.0 a implementace v dřívějších verzích.Tyto rozdíly a následné změny v chování kódu, které jsou popsány v výjimky: změny makra výjimku v verze 3.0.

Hlavní výhody převodu jsou:

  • Kód, který používá klíčová slova zpracování výjimek C++ kompiluje mírně nižší.EXE nebo.DLL.

  • Klíčová slova zpracování výjimek C++ jsou univerzálnější: zpracovávají výjimky datový typ, který lze kopírovat (int, float, chara tak dále), že makra zpracování výjimek pouze třídy CException a z něj odvozené třídy.

Hlavní rozdíl mezi makra a klíčových slov je, že odstraní kód makra pomocí "automaticky" Zachycenou výjimku při výjimky mimo rozsah.Kód pomocí klíčových slov nepotřebuje, takže musíte explicitně odstranit Zachycenou výjimku.Další informace naleznete v článku výjimky: zachycení a odstranění výjimky.

Dalším rozdílem je syntaxe.Syntaxe pro makra a klíčová slova se liší ve třech ohledech:

  1. Argumenty a hlášení výjimek:

    A ve SKUTEČNÉ vyvolání makro má následující syntaxi:

    CATCH (exception_class, exception_object_pointer_name)  

    Všimněte si, čárka názvu třídy a název ukazatele objektu.

    Prohlášení výjimku skutečné klíčové slovo používá tuto syntaxi:

    catch ( exception_type exception_name**)**

    Toto prohlášení prohlášení výjimka označuje typ výjimky úlovku blokovat úchyty.

  2. Vymezení bloky catch:

    S makry ve SKUTEČNÉ makro (argumenty) začíná první blok catch; AND_CATCH makro začíná další catch bloky a END_CATCH makro ukončí sekvenci bloky catch.

    S klíčovými slovy ve skutečné klíčové slovo (s jeho prohlášením výjimky) začíná každý blok catch.Není k dispozici žádné protějškem END_CATCH makra. blok catch končí jeho pravá složená závorka.

  3. Hodit výraz:

    Pomocí makra THROW_LAST k znovu vyvolání aktuální výjimku.throw Klíčové slovo, žádný argument má stejný účinek.

Provedení převodu

Chcete-li převést kód pomocí klíčových slov zpracování výjimek C++ pomocí maker

  1. Vyhledejte všechny výskyty maker knihovny MFC akci, ve SKUTEČNÉ, AND_CATCH, END_CATCH, VYVOLAT, a THROW_LAST.

  2. Nahradit nebo odstranit všechny výskyty následující makra:

    Zkuste (nahradit akci)

    CATCH (nahradit ve skutečné)

    AND_CATCH(Nahradit ve skutečné)

    END_CATCH(Odstranit)

    VYVOLÁ (nahradit throw)

    THROW_LAST(Nahradit throw)

  3. Argumenty makra upravte tak, že tvoří prohlášení platné výjimky.

    Například změnit.

    CATCH(CException, e)
    

    catch(CException* e)
    
  4. Upravte kód v catch bloky tak, aby jej odstraní objekty výjimek podle potřeby.Další informace naleznete v článku výjimky: zachycení a odstranění výjimky.

Zde je příklad kódu zpracování výjimek pomocí maker knihovny MFC výjimku.Všimněte si, že kód v následujícím příkladu používá makra výjimku e automaticky odstraněny:

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

Kód v následujícím příkladu používá klíčová slova výjimky C++, tak výjimka musí být explicitně odstraněna:

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();
}

Další informace naleznete v tématu výjimky: pomocí maker knihovny MFC a výjimky C++.

Viz také

Koncepty

Zpracování výjimek v prostředí MFC