Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här är ett avancerat ämne.
Den här artikeln beskriver hur du konverterar befintlig kod som skrivits med Microsoft Foundation-klassmakron – TRY, CATCH, THROW och så vidare – för att använda nyckelorden C++ undantagshantering try, catchoch throw. Ämnena omfattar:
Fördelar med konvertering
Du behöver förmodligen inte konvertera befintlig kod, även om du bör vara medveten om skillnaderna mellan makroimplementeringarna i MFC version 3.0 och implementeringarna i tidigare versioner. Dessa skillnader och efterföljande ändringar i kodbeteendet beskrivs i Undantag: Ändringar av undantagsmakron i version 3.0.
De främsta fördelarna med konvertering är:
Kod som använder nyckelorden C++ undantagshantering kompileras till en något mindre .EXE eller .DLL.
Nyckelorden för C++-undantagshantering är mer mångsidiga: De kan hantera undantag av alla datatyper som kan kopieras (
int,float,charoch så vidare), medan makrona endast hanterar undantag för klassCExceptionoch klasser som härleds från den.
Den största skillnaden mellan makrona och nyckelorden är att kod som använder makrona "automatiskt" tar bort ett undantag när undantaget hamnar utanför omfånget. Kod som använder nyckelorden gör det inte, så du måste uttryckligen ta bort ett fångat undantagsfel. Mer information finns i artikeln Undantag: Hantera och ta bort undantag.
En annan skillnad är syntax. Syntaxen för makron och nyckelord skiljer sig åt i tre avseenden:
Makroargument och undantagsdeklarationer:
Ett CATCH-makroanrop har följande syntax:
CATCH(exception_class, exception_object_pointer_name)
Observera kommatecknet mellan klassnamnet och objektpekarnamnet.
Undantagsdeklarationen för nyckelordet
catchanvänder den här syntaxen:catch(exception_typeexception_name)
Den här undantagsdeklarationssatsen anger vilken typ av undantag som catch block hanterar.
Avgränsning av fångstblock:
Med makrona börjar CATCH-makrot (med dess argument) det första catch-blocket. makrot AND_CATCH börjar efterföljande catch-block och END_CATCH makrot avslutar sekvensen med fångstblock.
Med nyckelorden inleder nyckelordet
catch(tillsammans med dess undantagsdeklaration) varje catch-block. Det finns ingen motsvarighet till END_CATCH-makrot; fångstblocket slutar med den avslutande klammerparentesen.Utkastsuttrycket:
Makrona använder THROW_LAST för att återskapa det aktuella undantaget. Nyckelordet
throw, utan argument, har samma effekt.
Utföra konverteringen
För att konvertera kod som använder makron till att använda C++-nyckelorden för undantagshantering
Leta upp alla förekomster av MFC-makrona TRY, CATCH, AND_CATCH, END_CATCH, THROW och THROW_LAST.
Ersätt eller ta bort alla förekomster av följande makron:
TRY (Ersätt det med
try)CATCH (Ersätt den med
catch)AND_CATCH (Ersätt den med
catch)END_CATCH (Ta bort den)
THROW (Ersätt den med
throw)THROW_LAST (Ersätt den med
throw)Ändra makroargumenten så att de bildar giltiga undantagsdeklarationer.
Du kan till exempel ändra
CATCH(CException, e)till
catch (CException* e)Ändra koden i catch-blocken så att den tar bort undantagsobjekt efter behov. Mer information finns i artikeln Undantag: Hantera och ta bort undantag.
Här är ett exempel på undantagshanteringskod med MFC-undantagsmakron. Observera att eftersom koden i följande exempel använder makrona tas undantaget e bort automatiskt:
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
Koden i nästa exempel använder undantagsnyckelorden i C++, så måste undantaget tas bort uttryckligen.
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();
}
Mer information finns i Undantag: Använda MFC-makron och C++-undantag.