Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A __try és a __finally kulcsszavakat használjuk egy lezáráskezelő létrehozásához. Az alábbi példa egy lezáráskezelő struktúráját mutatja be.
__try
{
// guarded body of code
}
__finally
{
// __finally block
}
Példák: A megszakításkezelőhasználata.
A kivételkezelőhöz hasonlóan a __try blokk és a __finally blokk is kapcsos zárójeleket ({}) igényel, és a goto utasítással bármelyik blokkba ugorhat.
A __try blokk a lezáráskezelő által védett kódtörzset tartalmazza. A függvények tetszőleges számú lezárási kezelővel rendelkezhetnek, és ezek a megszüntetési kezelési blokkok ugyanabban a függvényben vagy különböző függvényekben ágyazhatók be.
A __finally blokk akkor lesz végrehajtva, amikor a vezérlőfolyamat elhagyja a __try blokkot. A __finally blokk azonban nem lesz végrehajtva, ha a __try blokkon belül a következő függvények valamelyikét hívja meg: ExitProcess, ExitThread, vagy megszakítja.
A __finally blokk végrehajtása annak a függvénynek a kontextusában történik, amelyben a végpontkezelő található. Ez azt jelenti, hogy a __finally blokk hozzáférhet a függvény helyi változóihoz. A __finally blokk végrehajtása az alábbi eszközök bármelyikével leállhat.
- A blokk utolsó utasításának végrehajtása és a következő utasítás folytatása
- Vezérlőutasítás használata (visszatérési, törés, folytatásvagy goto)
- longjmp vagy egy kivételkezelőre ugrás használata
Ha a __try blokk végrehajtása egy keretalapú kivételkezelő kivételkezelési blokkját meghívó kivétel miatt leáll, a __finally blokk végrehajtása a kivételkezelési blokk végrehajtása előtt történik meg. Hasonlóképpen, a __try blokkból a longjmp C futásidejű kódtárfüggvényének hívása a __finally blokk végrehajtását okozza, mielőtt a végrehajtás a longjmp művelet céljára folytatódna. Ha __try blokkvégrehajtás egy vezérlőutasítás miatt leáll (visszatérési, törés, folytatódikvagy goto), a __finally blokk végrehajtásra kerül.
A AbnormalTermination függvény a __finally blokkon belül használható annak megállapítására, hogy a __try blokk egymás után leállt-e – vagyis elérte-e a záró zárójelet (}). A __try blokk elhagyása longjmphívása, egy kivételkezelőre való ugrás vagy egy visszatérési, törés, folytatásvagy goto utasítás miatt rendellenes megszakításnak minősül. Vegye figyelembe, hogy a megszakítás sikertelensége miatt a rendszer fordított sorrendben keres az összes veremkereten annak megállapításához, hogy szükség van-e megszüntetési kezelők meghívására. Ez több száz utasítás végrehajtása miatt teljesítménycsökkenést eredményezhet.
A megszakításkezelő rendellenes leállásának elkerülése érdekében a végrehajtásnak a blokk végéig kell folytatódnia. A __leave utasítást is végrehajthatja. A __leave utasítás lehetővé teszi a __try blokk azonnali leállítását anélkül, hogy rendellenes megszüntetést és teljesítménybírságot okoz. Ellenőrizze a fordító dokumentációjában, hogy a __leave utasítás támogatott-e.
Ha a __finally blokk végrehajtása a visszatérési vezérlőutasítás miatt leáll, az egyenértékű a goto a záró kapcsos zárójeltel a belefoglaló függvényben. Ezért a belefoglaló függvény vissza fog térni.