Udostępnij za pośrednictwem


Podnoszenie wyjątki programowe

Niektóre z najbardziej typowych źródeł błędów programu nie są oznaczane jako wyjątki przez system.Na przykład jeśli spróbujemy zaalokować blok pamięci, ale za mało pamięci, run-time lub funkcji interfejsu API nie wzbudzi wyjątku ale zwraca kod błędu.

Jednakże traktować jakiegokolwiek warunku, w drodze wyjątku wykrywania tego warunku w kodzie, a następnie sprawozdawczości, wywołując RaiseException funkcji.W ten sposób oznaczania flagami błędy, może przynieść korzyści strukturalnej obsługi wyjątków do wszelkiego rodzaju błąd w czasie wykonywania.

Aby użyć strukturalnej obsługi błędów wyjątków:

  • Definiowanie własnego kodu wyjątku dla zdarzenia.

  • Wywołanie RaiseException podczas wykrywania problem.

  • Aby przetestować kod wyjątku, który został zdefiniowany, korzystać z filtrów obsługi wyjątków.

WINERROR.H plik zawiera format kody wyjątków.Aby upewnić się, że kod, który powoduje konflikt z istniejącym kodem wyjątek nie zostanie zdefiniowana, należy ustawić trzecie najbardziej znaczący bit 1.Należy ustawić cztery najbardziej znaczących bitów, jak pokazano w poniższej tabeli.

Usługa BITS

Zalecanym ustawieniem binarnego

Opis

31-30

11

Te dwa bity opisują podstawowe status kod: 11 = błąd-00 = sukces, 01 = informacyjna, 10 = ostrzeżenie.

29

1

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

28

0

Zarezerwowany bit.(Urlop ustawione na 0).

Można ustawić pierwsze dwa bity ustawienie inne niż 11 binarne, jeśli mimo, że ustawienie "error" jest odpowiednie dla większości wyjątków.Ważną rzeczą do zapamiętania jest ustawić bity 29 i 28, jak pokazano w powyższej tabeli.

Wynikowy kod błędu powinna zatem mieć najwyższy cztery bity, ustaw wartość szesnastkową E.Na przykład następujące definicje zdefiniować kody wyjątków, które nie wchodzą w konflikt z wszelkie kody wyjątków systemu Windows.(Może jednak trzeba sprawdzić kody, które są używane przez strony trzeciej biblioteki DLL.)

#define STATUS_INSUFFICIENT_MEM       0xE0000001
#define STATUS_FILE_BAD_FORMAT        0xE0000002

Po zdefiniowaniu kod wyjątku, można go użyć wzbudza wyjątek.Na przykład poniższy kod wzbudza 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 chcesz po prostu wzbudzi wyjątku można ustawić trzy ostatnie parametry na 0.Trzy parametry ostatni są przydatne do przekazywania informacji dodatkowych i ustawienie flagi uniemożliwia kontynuowanie wykonywania programów obsługi.Zobacz RaiseException funkcjonować w Windows SDK Aby uzyskać więcej informacji.

W Twoich filtrów obsługi wyjątków można następnie testować dla kodów, zdefiniowany przez użytkownika.Na przykład:

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

Zobacz też

Informacje

Pisanie procedury obsługi wyjątków

Strukturalnej obsługi (C++) wyjątków