Sdílet prostřednictvím


Zpracování výjimek

Operační systém používá strukturované zpracování výjimek k signalizaci určitých druhů chyb. Rutina volaná ovladačem může vyvolat výjimku, kterou ovladač musí zpracovat.

Systém zachytí následující obecné druhy výjimek:

  1. Chyby nebo pasti definované hardwarem, například

    • Porušení přístupu (viz níže)
    • Nesprávné zarovnání datového typu (například 16bitová jednotka zarovnaná na liché bajtu)
    • Neplatné a privilegované instrukce
    • Neplatné sekvence zámků (pokus o spuštění neplatné sekvence instrukcí v rámci vzájemně zablokované části kódu)
    • Dělení celého čísla nulou a přetečení.
    • Plovoucí čárky při dělení nulou, přetečení, podtečení a rezervované operandy.
    • Body přerušení a krokování (pro podporu ladicích programů)
  2. Systémové softwarově definované výjimky, například

    • Porušení ochrany stránek (pokus o načtení nebo uložení dat z nebo do umístění na stránce ochrany)
    • Chyby čtení stránky (pokus o načtení stránky do paměti a zjištění souběžné vstupně-výstupní chyby)

Porušení přístupu je pokus o provedení operace na stránce, která není povolena v aktuálním nastavení ochrany stránky. K narušení přístupu dochází v následujících situacích:

  • Neplatná operace čtení nebo zápisu, například zápis na stránku jen pro čtení.

  • Přístup k paměti nad rámec limitu adresního prostoru aktuálního programu (označovaného jako porušení délky).

  • Přístup ke stránce, která je aktuálně rezidentní, ale vyhrazena pro použití systémové součásti. Například kód uživatelského režimu nemá povolený přístup ke stránce, kterou jádro používá.

Pokud by operace mohla způsobit výjimku, ovladač by měl operaci uzavřít do bloku try/except . Přístupy k umístěním v uživatelském režimu jsou typické příčiny výjimek. Například rutina ProbeForWrite kontroluje, že ovladač může ve skutečnosti zapisovat do vyrovnávací paměti uživatelského režimu. Pokud to nejde, rutina vyvolá STATUS_ACCESS_VIOLATION výjimku. V následujícím příkladu kódu ovladač volá ProbeForWrite v try/except, aby mohl zpracovat výslednou výjimku, pokud k ní dojde.

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 */
    ...
}

Řídící moduly musí řešit všechny vyvolané výjimky. Výjimka, která není zpracována, způsobí, že systém zkontroluje chybu. Ovladač, který způsobí vyvolání výjimky, ji musí také zpracovat; ovladač nižší úrovně totiž nemůže spoléhat na to, že výjimku zpracuje ovladač vyšší úrovně.

Ovladače mohou přímo vyvolat výjimku pomocí rutin ExRaiseAccessViolation, ExRaiseDatatypeMisalignment nebo ExRaiseStatus . Ovladač musí zpracovat všechny výjimky, které tyto rutiny vyvolávají.

Následuje částečný seznam rutin, které mohou alespoň v určitých situacích vyvolat výjimku:

Přístupy k paměti k bufferům v uživatelském režimu mohou také způsobit narušení přístupu. Další informace naleznete v sekci Chyby v odkazování na uživatelské adresy.

Mějte na paměti, že strukturované zpracování výjimek se liší od výjimek jazyka C++. Jádro nepodporuje výjimky jazyka C++.

Další informace o strukturovaném zpracování výjimek najdete v sadě Microsoft Windows SDK a dokumentaci k sadě Visual Studio.