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:
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.
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.
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
Vyhledejte všechny výskyty maker knihovny MFC akci, ve SKUTEČNÉ, AND_CATCH, END_CATCH, VYVOLAT, a THROW_LAST.
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)
Argumenty makra upravte tak, že tvoří prohlášení platné výjimky.
Například změnit.
CATCH(CException, e)
až
catch(CException* e)
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++.