Kivételek kezelése

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:

  1. 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)
  2. 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.