Udostępnij za pośrednictwem


Występowanie wyjątków programowych

Niektóre z najczęstszych źródeł błędów programu nie są oznaczane jako wyjątki przez system.Na przykład jeśli użytkownik spróbuje przydzielić blok pamięci, ale ilość pamięci jest niewystarczająca, wykonanie lub funkcja interfejsu API nie zgłosi wyjątku, ale zwróci kod błędu.

Jednak można traktować dowolny warunek jako wyjątek przez wykrycie tego warunku w kodzie i zgłaszanie go przez wywołanie funkcji RaiseException.Flagowanie błędów w ten sposób, może przynieść korzyści obsługi wyjątków strukturyzowanych do wszelkiego rodzaju błędów w czasie wykonywania.

Aby użyć strukturyzowanej obsługi wyjątków z błędami:

  • Zdefiniuj własny kod wyjątku dla zdarzenia.

  • Wywołaj RaiseException kiedy problem zostanie wykryty.

  • Użyj filtrów obsługi wyjątków, aby przetestować kod wyjątku, który został zdefiniowany.

Plik WINERROR.H pokazuje format dla kodów wyjątków.Aby upewnić się, że nie zostanie zdefiniowany kod, który powoduje konflikt z istniejącym kodem wyjątku, należy ustawić trzeci najbardziej znaczący bit na 1.Cztery najbardziej znaczące bity powinny być ustawione, jak pokazano w poniższej tabeli.

Bity

Zalecane ustawienie binarne

Opis

31-30

11

Te dwa bity opisują podstawowy stan kodu: 11 = błąd, 00 = sukces, 01 = informacyjny, 10 = ostrzeżenie.

29

1

Bit klienta.Wartość 1 dla kodów zdefiniowanych przez użytkownika.

28

0

Zarezerwowany bit. (Pozostawić ustawione na 0).

Można ustawić pierwsze dwa bity na ustawienie inne niż 11 binarnie, mimo że ustawienie "błąd" jest odpowiednie dla większości wyjątków.Jest ważne, aby pamiętać o ustawieniu bitów 29 i 28, jak pokazano w poprzedniej tabeli.

Wynikowy kod błędu powinien zatem mieć najwyższe cztery bity ustawione na szesnastkowe E.Na przykład następujące definicje definiują kody wyjątków, które nie wchodzą w konflikt z żadnymi kodami wyjątków systemu Windows. (Jednakże trzeba sprawdzić kody, które są używane przez biblioteki DLL stron trzecich.)

#define STATUS_INSUFFICIENT_MEM       0xE0000001
#define STATUS_FILE_BAD_FORMAT        0xE0000002

Po zdefiniowaniu kodu wyjątku można go użyć, aby zgłosić wyjątek.Na przykład poniższy kod zgłasza wyjątek STATUS_INSUFFICIENT_MEM w odpowiedzi na problem z alokacją pamięci:

lpstr = _malloc( nBufferSize );
if (lpstr == NULL)
    RaiseException( STATUS_INSUFFICIENT_MEM, 0, 0, 0);

Jeżeli trzeba tylko zgłosić wyjątek, ostatnie trzy parametry można ustawić na 0.Trzy ostatnie parametry są przydatne do przekazywania informacji dodatkowych i ustawiania flag, które uniemożliwiają kontynuowanie wykonywania programów obsługi.Zobacz funkcję RaiseException w Windows SDK, aby uzyskać więcej informacji.

W filtrach obsługi wyjątków można przetestować kody, które zostały już zdefiniowane.Na przykład:

__try {
    ...
}
__except (GetExceptionCode() == STATUS_INSUFFICIENT_MEM ||
        GetExceptionCode() == STATUS_FILE_BAD_FORMAT )

Zobacz też

Informacje

Pisanie programu do obsługi wyjątku

Obsługa wyjątków strukturalnych (C/C++)