Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az operációs rendszer strukturált kivételkezeléssel jelez bizonyos típusú hibákat. Az illesztőprogram által hívott rutin kivételt jelenthet, amelyet az illesztőprogramnak kezelnie kell.
A rendszer a következő általános kivételtípusokat fogja el:
Hardver által definiált hibák vagy trapek, például:
- Hozzáférési szabálysértések (lásd alább)
- Adattípusú eltérés (például egy 16 bites entitás, amely egy páratlan bájtos határhoz van igazítva)
- Illegális és kiemelt utasítások
- Érvénytelen zárolási sorozatok (érvénytelen utasítássorozat végrehajtása a kód egy összekapcsolt szakaszában)
- Az egész szám nullával és túlcsordulással oszlik meg
- A lebegőpontos osztás nullával, túlcsordulásokkal, aláfolyásokkal és fenntartott operandusokkal
- Töréspontok és egylépéses végrehajtás (a hibakeresők támogatásához)
Rendszerszoftver által meghatározott kivételek, például:
- Biztonsági oldal megsértései (adatok betöltése vagy tárolása védett oldalon belül)
- Oldalolvasási hibák (oldal olvasása a memóriába és egyidejű I/O-hiba)
A hozzáférés megsértése olyan műveletet kísérel meg végrehajtani egy lapon, amely az aktuális lapvédelmi beállítások szerint nem engedélyezett. A hozzáférés megsértése a következő helyzetekben fordul elő:
Érvénytelen olvasási vagy írási művelet, például írás csak olvasható oldalra.
A memória elérése az aktuális program címterének korlátján túl (más néven hosszsértés).
Egy oldal elérése, amely jelenleg a rendszer egy komponensének használatára van dedikálva. A felhasználói módú kód például nem fér hozzá a kernel által használt lapokhoz.
Ha egy művelet kivételt okozhat, az illesztőnek egy próba/kivétel blokkba kell csatolnia a műveletet. A kivételek tipikus okai a helyek felhasználói módban való elérései. A ProbeForWrite rutin például ellenőrzi, hogy az illesztőprogram ténylegesen tud-e írni egy felhasználói módú pufferbe. Ha nem tudja, a rutin STATUS_ACCESS_VIOLATION kivételt dob. A következő kódpéldában az illesztő próba/kivételként meghívja a ProbeForWrite-ot, hogy kezelni tudja az eredményül kapott kivételt, ha van ilyen.
try {
...
ProbeForWrite(Buffer, BufferSize, BufferAlignment);
/* Note that any access (not just the probe, which must come first,
* by the way) to Buffer must also be within a try-except.
*/
...
} except (EXCEPTION_EXECUTE_HANDLER) {
/* Error handling code */
...
}
Az illesztőprogramoknak kezelnie kell a felmerült kivételeket. A nem kezelt kivétel miatt a rendszer hibát ellenőriz. A kivételt kiváltó illesztőprogramnak kezelnie kell azt: az alacsonyabb szintű illesztő nem támaszkodhat magasabb szintű illesztőprogramra a kivétel kezeléséhez.
Az illesztőprogramok létrehozhatnak közvetlenül kivételeket az ExRaiseAccessViolation, az ExRaiseDatatypeMisalignment vagy az ExRaiseStatus rutinok használatával. Az illesztőprogramnak kezelnie kell a rutinok által kiváltott kivételeket.
Az alábbiakban felsoroljuk azokat a rutinokat, amelyek – legalábbis bizonyos helyzetekben – kivételt okozhatnak:
A felhasználói módú pufferekhez való memóriahozzáférések hozzáférési szabálysértéseket is okozhatnak. További információért lásd: Hivatkozási hibák, User-Space címek és.
Vegye figyelembe, hogy a strukturált kivételkezelés eltér a C++ kivételektől. A kernel nem támogatja a C++ kivételeket.
A strukturált kivételkezeléssel kapcsolatos további információkért tekintse meg a Microsoft Windows SDK-t és a Visual Studio dokumentációját.