Sdílet prostřednictvím


Výjimky: Převod z maker výjimek MFC

Toto je rozšířené téma.

Tento článek vysvětluje, jak převést existující kód napsaný pomocí maker třídy Microsoft Foundation – TRY, CATCH, THROW a tak dále – na použití klíčových slov pro zpracování výjimek v C++ try, catch, throw. Témata:

Výhody převodu

Pravděpodobně nemusíte převádět existující kód, i když byste si měli být vědomi rozdílů mezi implementacemi maker v prostředí MFC verze 3.0 a implementacemi v dřívějších verzích. Tyto rozdíly a následné změny chování kódu jsou diskutovány v Výjimky: Změny v makrech výjimek ve verzi 3.0.

Hlavní výhody převodu jsou:

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

  • Klíčová slova zpracování výjimek jazyka C++ jsou všestrannější: Mohou zpracovávat výjimky libovolného datového typu, který lze kopírovat (int, float, charatd.), zatímco makra zpracovávají výjimky pouze třídy CException a třídy odvozené z něj.

Hlavním rozdílem mezi makry a klíčovými slovy je, že kód používající makra "automaticky" odstraní zachycenou výjimku, když výjimka přejde mimo rozsah. Kód, který využívá klíčová slova, to sám neudělá, takže je nutné zachycenou výjimku explicitně odstranit. Další informace najdete v článku Výjimky: Zachytávání a odstraňování výjimek.

Dalším rozdílem je syntaxe. Syntaxe maker (makra) a klíčových slov se liší ve třech ohledech:

  1. Argumenty makra a výjimková deklarace:

    Vyvolání makra CATCH má následující syntaxi:

    CATCH(exception_class, exception_object_pointer_name)

    Všimněte si čárky mezi názvem třídy a názvem ukazatele objektu.

    Deklarace výjimky pro catch klíčové slovo používá tuto syntaxi:

    catch(exception_type exception_name)

    Tento příkaz deklarace výjimky označuje typ výjimky, které blok catch zpracovává.

  2. Vymezení bloků catch:

    S makry začne makro CATCH (s argumenty) první blok catch; makro AND_CATCH zahájí následné bloky catch a END_CATCH makro ukončí posloupnost bloků catch.

    Klíčové slovo catch (s deklarací výjimky) zahajuje každý blok catch u klíčových slov. Pro makro END_CATCH neexistuje žádný protějšek; blok zachycení končí pravou závorkou.

  3. Výraz throw:

    Makra používají THROW_LAST k opětovnému vyvolání aktuální výjimky. Klíčové throw slovo bez argumentu má stejný účinek.

Provedení převodu

Převod kódu z používání maker na použití klíčových slov pro zpracování výjimek v jazyce C++

  1. Vyhledejte všechny výskyty maker MFC TRY, CATCH, AND_CATCH, END_CATCH, THROW a THROW_LAST.

  2. Nahraďte nebo odstraňte všechny výskyty následujících makra:

    TRY (nahradit ho try)

    CATCH (nahraďte ho catch)

    AND_CATCH (nahraďte ho catch)

    END_CATCH (odstranit)

    THROW (nahraďte ho throw)

    THROW_LAST (nahraďte ho throw)

  3. Upravte argumenty makra tak, aby vytvořily platné deklarace výjimek.

    Například změnit

    CATCH(CException, e)
    

    na

    catch (CException* e)
    
  4. Upravte kód v blocích catch tak, aby v případě potřeby odstranil objekty výjimek. Další informace najdete v článku Výjimky: Zachytávání a odstraňování výjimek.

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

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 dalším příkladu používá klíčová slova výjimek jazyka C++, takže 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: Použití maker MFC a výjimek jazyka C++.

Viz také

zpracování výjimek