Глава 1. Обработка ошибок. docx 7
Вы тоже можете это сделать
Итак, я показал, как функции Windows сообщают об ошибках. Майкрософт по-
зволяет вам использовать этот механизм и в собственных функциях. Допустим,
вы пишете функцию, к которой будут обращаться другие программы. Вызов этой
функции может по какой-либо причине завершиться неудачно, и вам тоже нужно
сообщать об ошибках. С этой целью вы просто устанавливаете код последней
ошибки в потоке и возвращаете значение FALSE, INVALID_HANDLE_VALUE,
NULL или что-то другое, более подходящее в Вашем случае. Чтобы установить
код последней ошибки в потоке, вы вызываете SetLastError
VOID SetLastError(DWORD dwErrCode);
и передаете ей нужное 32-битное число. Я стараюсь использовать коды, уже оп-
ределенные в WinError. h, — при условии, что они подходят под те ошибки, о ко-
торых могут сообщать мои функции. Если вы считаете, что ни один из кодов в
WinError. h не годится для ошибки, возможной в вашей функции, определите свой
код. Он представляет собой 32-битное значение, которое разбито на поля, пока-
занные в следующей таблице.
Табл. 1-2. Поля кода ошибки
Биты 31-30 29 28 27-16 15-0
Содержимое: Кем опреде-
Код степени «тяже- лен — Майкро- Код подсистемы
Зарезервирован Код исключения
сти» (severity) софт или поль- (facility code)
зователем
Значение: 0 = успех;
Первые 256
1 = информация; Определяется
0 = Майкрософт; значений опре-
2 = предупрежде- Должен быть 0 Майкрософт или
1 = пользователь деляются Майк-
ние; пользователем
рософт
3 = ошибка
Подробнее об этих полях я рассказываю в главе 24. На данный момент единст-
венное важное для вас поле — бит 29. Майкрософт обещает, что все коды оши-
бок, генерируемые ее функциями, будут содержать 0 в этом бите. Если вы опре-
деляете собственный код ошибки, запишите сюда 1. Тогда у вас будет гарантия,
что ваш код ошибки не войдет в конфликт с кодом, определенным Майкро-
софт, — ни сейчас, ни в будущем. Заметьте, что код Facility может принимать
4096 возможных значений, из которых первые 256 Майкрософт зарезервировала
для собственных нужд, а остальные доступны для использования в приложениях
всем желающим.
8 Часть I. Материалы для обязательного чтения
Программа-пример ErrorShow
Эта программа, «01 ErrorShow. exe» (см.