Sdílet prostřednictvím


Výjimky: Převádění z maker výjimek prostředí 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 atd .trycatchthrow Témata:

Výhody převodu

Pravděpodobně nemusíte převést existující kód, i když byste měli vědět o rozdílech 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 popsány ve výjimkách: Změny maker výjimek ve verzi 3.0.

Hlavní výhody převodu jsou:

  • Kód, který používá klíčová slova pro zpracování výjimek jazyka C++, se zkompiluje na mírně menší soubor .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 využívající klíčová slova není, takže je nutné explicitně odstranit zachycenou výjimku. 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 a klíčových slov se liší ve třech ohledech:

  1. Argumenty makra a deklarace výjimek:

    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 popisovačů bloku catch.

  2. Oddělovač bloků catch:

    V makrech makro CATCH (s jeho argumenty) začíná první blok catch; AND_CATCH makro začíná další bloky catch a END_CATCH makro ukončí posloupnost bloků catch.

    U klíčových slov začíná klíčové slovo catch (s deklarací výjimky) každý blok catch. Neexistuje žádný protějšek END_CATCH makra; blok catch 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 pomocí maker pro použití klíčových slov zpracování výjimek jazyka 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 maker:

    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.

Tady je příklad kódu zpracování výjimek pomocí maker výjimek MFC. 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