Zvýšení výjimky Software
Některé nejběžnější zdroje chyby programu nebudou označeny jako výjimky v systému.Například pokud je pokus o přidělení paměti bloku, ale není dostatek paměti, spuštění nebo rozhraní API funkce nesmí vyvolat výjimku, ale vrátí kód chyby.
Však považovat všechny podmínky jako výjimku zjišťování této podmínky v kódu a podávání zpráv voláním RaiseException funkce.Tímto způsobem označíte příznakem chyby, můžete přenést výhody structured exception na jakýkoli druh Chyba spuštění zpracování.
Použití structured exception zpracování chyb:
Definujte vlastní kód výjimky pro událost.
Volání RaiseException při zjištění problému.
Zpracování výjimek filtry lze použijte k testování kód výjimky, které jste definovali.
WINERROR.H souboru zobrazuje formát pro kódy výjimku.Chcete-li se ujistit, že není definovat kód, který je v konfliktu s existující kód výjimky, nastavte třetí nejvýznamnější bit 1.Čtyři většinu významné bity je třeba nastavit podle následující tabulky.
Bity |
Doporučené nastavení pro binární |
Description |
---|---|---|
31-30 |
11 |
Tyto dva bity popisují základní stavový kód: 11 = chyba 00 = success 01 = informační, 10 = upozornění. |
29 |
1 |
Bit klienta.Nastavte hodnotu 1 pro uživatelem definované kódy. |
28 |
0 |
Vyhrazený bit.(Ponechat hodnotu 0). |
Můžete nastavit první dva bity nastavení jiných než 11 binární Pokud chcete, přestože je vhodné pro většinu výjimky nastavení "Chyba".Je důležité si zapamatovat nastavení bitů 29 a 28 uvedené v předchozí tabulce.
Výsledný kód chyby by proto mít nejvyšší čtyři bity s hexadecimální E.Například následující definice definovat výjimky kódy, které nekolidují s jakékoli výjimky kódy systému Windows.(Může však musíte zkontrolovat kódy, které využívají jiných knihoven DLL.)
#define STATUS_INSUFFICIENT_MEM 0xE0000001
#define STATUS_FILE_BAD_FORMAT 0xE0000002
Po definování kód výjimky, můžete ji vyvolat výjimku.Následující kód například vyvolá výjimku STATUS_INSUFFICIENT_MEM v reakci na potíže s přidělováním paměti:
lpstr = _malloc( nBufferSize );
if (lpstr == NULL)
RaiseException( STATUS_INSUFFICIENT_MEM, 0, 0, 0);
Pokud chcete jednoduše vyvolat výjimku, je poslední tři parametry nastavit na hodnotu 0.Poslední tři parametry jsou užitečné pro předání dalších informací a nastavení příznaku zabrání pokračováním spuštění obslužné rutiny.Najdete RaiseException fungovat Windows SDK Další informace.
Ve zpracování výjimek filtry potom můžete testovat pro kódy, které jste definovali.Příklad:
__try {
...
}
__except (GetExceptionCode() == STATUS_INSUFFICIENT_MEM ||
GetExceptionCode() == STATUS_FILE_BAD_FORMAT )