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 keretalapú kivételkezelő lehetővé teszi, hogy kezeljük annak lehetőségét, hogy a kód egy adott szakaszában kivétel következzen be. A keret alapú kivételkezelő a következő elemekből áll.
- Védett kódblokk
- Szűrőkifejezés
- Kivételkezelő blokk
A keret alapú kivételkezelők nyelvspecifikus szintaxisban deklarálódnak. A Microsoft C/C++ optimalizálási fordítóban például __try és __excepthasználatával implementálják őket. További információ: Kezelő szintaxisa.
A védett kódtörzs egy vagy több utasításkészlet, amelyekhez a szűrőkifejezés és a kivételkezelő blokk kivételkezelési védelmet biztosít. A védett törzs lehet kódblokk, beágyazott blokkok készlete, vagy egy teljes eljárás vagy függvény. A Microsoft C/C++ optimalizálási fordító használatával a védett törzset a __try kulcsszót követő kapcsos zárójelek ({}) közé zárják.
A keretalapú kivételkezelő szűrőkifejezés olyan kifejezés, amelyet a rendszer kiértékel, amikor kivétel történik a védett testen belül. Ez az értékelés a rendszer alábbi műveleteinek egyikét eredményezi.
- A rendszer leállítja a kivételkezelő keresését, visszaállítja a gép állapotát, és folytatja a szálvégrehajtást a kivétel bekövetkeztének időpontjában.
- A rendszer folytatja a kivételkezelő keresését.
- A rendszer átadja a vezérlőt a kivételkezelőnek, és a szálvégrehajtás egymás után folytatódik abban a veremkeretben, amelyben a kivételkezelő található. Ha a kezelő nem abban a veremkeretben van, amelyben a kivétel történt, a rendszer kicsomagolja a vermet, elhagyva az aktuális veremkeretet és az egyéb veremkereteket, amíg vissza nem kerül a kivételkezelő veremkeretéhez. A kivételkezelő végrehajtása előtt a rendszer végrehajtja a lezárási kezelőket minden olyan védett kódrész esetében, amely a vezérlés kivételkezelőnek való átadása eredményeként leállt. A megszüntetési kezelőkkel kapcsolatos további információkért tekintse meg Megszüntetés kezelésecímű témakört.
A szűrőkifejezés lehet egyszerű kifejezés, vagy meghívhat egy szűrőfüggvényt, amely megpróbálja kezelni a kivételt. Meghívhatja a GetExceptionCode és GetExceptionInformation függvényeket a szűrőkifejezésen belül, hogy információt kapjon a szűrt kivételről. GetExceptionCode egy olyan kódot ad vissza, amely azonosítja a kivétel típusát, és GetExceptionInformation egy EXCEPTION_POINTERS struktúrára mutató mutatót ad vissza, amely CONTEXT és EXCEPTION_RECORD struktúrákra mutató mutatót tartalmaz.
Ezek a függvények nem hívhatók meg szűrőfüggvényekből, de visszatérési értékük paraméterként átadható egy szűrőfüggvénynek. GetExceptionCode a kivételkezelő blokkon belül használható, de GetExceptionInformation nem, mert az általa mutatott információk általában a veremen találhatók, és a vezérlés kivételkezelőbe való átvitelekor megsemmisülnek. Az alkalmazások azonban átmásolhatják az adatokat a biztonságos tárolóba, hogy elérhetővé tegyék a kivételkezelő számára.
A szűrőfüggvény előnye, hogy képes kezelni egy kivételt, és visszaad egy értéket, amely miatt a rendszer a kivétel bekövetkezésétől kezdve folytatja a végrehajtást. Ezzel szemben egy kivételkezelő blokk esetén a végrehajtás folyamatosan a kivételkezelőtől folytatódik, nem pedig a kivétel pontjától.
A kivétel kezelése olyan egyszerű lehet, mint egy hiba észlelése és a később megvizsgálandó jelző beállítása, figyelmeztetés vagy hibaüzenet nyomtatása, vagy más korlátozott művelet végrehajtása. Ha a végrehajtás folytatható, szükség lehet a gép állapotának módosítására is a környezeti rekord módosításával. Az oldalhibák kivételét kezelő szűrőfüggvények példáiért lásd: A virtuális memóriafüggvényekhasználata.
A UnhandledExceptionFilter függvény szűrőfüggvényként használható egy szűrőkifejezésben. EXCEPTION_EXECUTE_HANDLER-t ad vissza, kivéve, ha a folyamat hibakeresése folyamatban van, ebben az esetben EXCEPTION_CONTINUE_SEARCH-t ad vissza.