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 )