Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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řídyCExceptiona 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:
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
catchklíč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á.
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.Výraz throw:
Makra používají THROW_LAST k opětovnému vyvolání aktuální výjimky. Klíčové
throwslovo 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++
Vyhledejte všechny výskyty maker MFC TRY, CATCH, AND_CATCH, END_CATCH, THROW a THROW_LAST.
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)Upravte argumenty makra tak, aby vytvořily platné deklarace výjimek.
Například změnit
CATCH(CException, e)na
catch (CException* e)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++.