Výjimky: Převod z makra výjimku MFC
Toto je rozšířená.
Tento článek vysvětluje, jak převést existující kód napsaný s makra Microsoft Foundation Class – akci, úlovku, VYVOLÁNÍMatd – pomocí klíčových slov jazyka C++ zpracování výjimek akci, úlovku, a throw.Témata zahrnují:
Výhody převodu
Převod kódu s výjimkou maker používat výjimky C++
Výhody převodu
Pravděpodobně nepotřebujete převést existující kód, přestože by měla být vědoma rozdíly mezi implementacemi makro v MFC verze 3.0 a implementace v předchozích verzích.Tyto rozdíly a následné změny v chování kódu jsou popsány v výjimky: změny makra výjimku ve verzi 3.0.
Převod hlavní výhody jsou:
Kompiluje kód, který používá klíčových slov jazyka C++ zpracování výjimek k poněkud menší.EXE nebo.DLL.
Klíčových slov jazyka C++ zpracování výjimek jsou univerzálnější: jejich zpracování výjimek libovolný datový typ, který lze kopírovat (int, plovoucí, char, atd) k tomu, že makra popisovač výjimky pouze pro třídy CException a třídy odvozené od něj.
Hlavní rozdíl mezi maker a klíčová slova je, že odstraní kód makra pomocí "automaticky" zachytil výjimku při výjimku dostane mimo rozsah.Kód pomocí klíčových slov není, tak musíte explicitně odstranit zachytil výjimku.Další informace naleznete v článku výjimky: výjimky odlovy a odstraňování.
Dalším rozdílem je syntaxe.Syntaxe pro makra a klíčová slova se liší ve třech ohledech:
Makro argumenty a prohlášení o výjimce:
A úlovku makro vyvolání má následující syntaxi:
CATCH (exception_class, exception_object_pointer_name)
Všimněte si čárka název třídy a ukazatel název objektu.
Prohlášení o výjimku úlovku klíčové slovo používá následující syntaxi:
catch (exception_typeexception_name)
Toto prohlášení prohlášení výjimku označuje typ výjimky úlovku blokovat úchyty.
Vymezení bloky catch:
S makry úlovku makro (argumenty) začíná první blok catch; AND_CATCH bloky catch následné začíná makro a END_CATCH makro ukončí posloupnost bloky catch.
Pomocí klíčových slov úlovku klíčové slovo (s jeho prohlášením výjimka) začíná každý blok catch.Neexistuje žádný protějškem END_CATCH makra. bloku catch končí jeho pravá složená závorka.
Throw výraz:
Použití maker THROW_LAST k opětné vyvolání výjimky aktuální.throw Klíčové slovo s žádný argument má stejný účinek.
Provedení převodu
Převést kód pomocí klíčových slov jazyka C++ zpracování výjimek pomocí maker
Vyhledejte všechny výskyty MFC makra akci, úlovku, AND_CATCH, END_CATCH, VYVOLÁNÍM, a THROW_LAST.
Nahradit nebo odstranit všechny výskyty následující makra:
Zkuste (nahradit akci)
CATCH (nahradit úlovku)
AND_CATCH(Nahradit úlovku)
END_CATCH(Odstranit)
VYVOLÁNÍM (nahradit throw)
THROW_LAST(Nahradit throw)
Argumenty makro upravte, aby prohlášení platnou výjimku tvoří.
Například změnit.
CATCH(CException, e)
na hodnotu
catch(CException* e)
Upravte kód v bloky catch tak odstraní objekty výjimku podle potřeby.Další informace naleznete v článku výjimky: výjimky odlovy a odstraňování.
Zde je příklad kódu zpracování výjimek pomocí makra 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ých slov jazyka C++ výjimek proto musí výslovně odstranit výjimku:
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 výjimky: pomocí makra MFC a výjimky C++.