Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.
Dit is een geavanceerd onderwerp.
In dit artikel wordt uitgelegd hoe u bestaande code die is geschreven met Microsoft Foundation Class-macro's ( TRY, CATCH, THROW, enzovoort) converteert om de C++-trefwoorden tryvoor uitzonderingsafhandeling te gebruiken, catchen throw. Dit zijn een aantal van de onderwerpen:
Voordelen van converteren
U hoeft waarschijnlijk geen bestaande code te converteren, hoewel u rekening moet houden met verschillen tussen de macro-implementaties in MFC versie 3.0 en de implementaties in eerdere versies. Deze verschillen en volgende wijzigingen in codegedrag worden besproken in Uitzonderingen: Wijzigingen in uitzonderingsmacro's in versie 3.0.
De belangrijkste voordelen van converteren zijn:
Code die gebruikmaakt van de C++ uitzonderingsafhandelingstrefwoorden wordt gecompileerd naar een iets kleinere .EXE of .DLL.
De C++-trefwoorden voor uitzonderingsafhandeling zijn veelzijdiger: ze kunnen uitzonderingen verwerken van elk gegevenstype dat kan worden gekopieerd (
intfloat,charenzovoort), terwijl de macro's alleen uitzonderingen verwerken van klasseCExceptionen klassen die ermee zijn afgeleid.
Het belangrijkste verschil tussen de macro's en de trefwoorden is dat met behulp van de macro's automatisch een opgepakte uitzondering wordt verwijderd wanneer de uitzondering buiten het bereik valt. Code gebruikt de trefwoorden niet, dus u moet expliciet een opgevangen uitzondering verwijderen. Zie het artikel Uitzonderingen: Uitzonderingen vangen en verwijderen voor meer informatie.
Een ander verschil is syntaxis. De syntaxis voor macro's en trefwoorden verschilt in drie opzichten:
Macroargumenten en uitzonderingsdeclaraties:
Een CATCH-macro-aanroep heeft de volgende syntaxis:
CATCH(exception_class, exception_object_pointer_name)
Let op de komma tussen de klassenaam en de naam van de objectaanwijzer.
In de uitzonderingsdeclaratie voor het
catchtrefwoord wordt deze syntaxis gebruikt:catch(exception_typeexception_name)
Deze uitzonderingsverklaring geeft het type uitzondering aan dat het catch-blok afhandelt.
Scheiding van vangstblokken:
Met de macro's begint de CATCH-macro (met de argumenten) het eerste catch-blok; de AND_CATCH macro begint volgende catch blocks en de END_CATCH macro beëindigt de reeks catch blocks.
Met de trefwoorden begint het
catchtrefwoord (met de uitzonderingsdeclaratie) elk catch-blok. Er is geen tegenhanger voor de END_CATCH macro; het catch-block eindigt met de accolade.De throw-expressie:
De macro's gebruiken THROW_LAST om de huidige uitzondering opnieuw te genereren. Het
throwtrefwoord, zonder argument, heeft hetzelfde effect.
De conversie uitvoeren
Code converteren met macro's om de C++-trefwoorden voor uitzonderingsafhandeling te gebruiken
Zoek alle exemplaren van de MFC-macro's TRY, CATCH, AND_CATCH, END_CATCH, THROW en THROW_LAST.
Vervang of verwijder alle exemplaren van de volgende macro's:
TRY (vervang het door
try)CATCH (vervang het door
catch)AND_CATCH (vervangen door
catch)END_CATCH (verwijderen)
THROW (Vervang het door
throw)THROW_LAST (vervangen door
throw)Wijzig de macroargumenten zodat ze geldige uitzonderingsdeclaraties vormen.
Bijvoorbeeld: wijzigen
CATCH(CException, e)naar
catch (CException* e)Wijzig de code in de catch-blokken, zodat uitzonderingsobjecten zo nodig worden verwijderd. Zie het artikel Uitzonderingen: Uitzonderingen vangen en verwijderen voor meer informatie.
Hier volgt een voorbeeld van code voor het afhandelen van uitzonderingen met behulp van MFC-uitzonderingsmacro's. Omdat de code in het volgende voorbeeld gebruikmaakt van de macro's, wordt de uitzondering e automatisch verwijderd:
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
De code in het volgende voorbeeld maakt gebruik van de C++-uitzonderingstrefwoorden, dus de uitzondering moet expliciet worden verwijderd:
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();
}
Zie Uitzonderingen: MFC-macro's en C++-uitzonderingen gebruiken voor meer informatie.