В настоящее время я изучаю C ++ в связи с WinAPI. Я изо всех сил пытаюсь придумать значимую стратегию обработки ошибок для функций WinAPI.
ПРОБЛЕМА:
Большинство функций WinAPI могут возвращать 0 в случае ошибки, но во многих случаях я не вижу никакой информации на MSDN относительно того, что могло вызвать такую ошибку и как ее устранить / устранить. принятие GetCursorPos
В качестве примера:
Возвращает ненулевое значение в случае успеха или ноль в противном случае. Чтобы получить расширенную информацию об ошибке, позвоните GetLastError.
(…)
Рабочий стол ввода должен быть текущим рабочим столом при вызове GetCursorPos. Вызов OpenInputDesktop определить, является ли текущий рабочий стол входным рабочим столом. Если это не так, позвоните SetThreadDesktop с HDESK вернулся OpenInputDesktop переключиться на этот рабочий стол.
Если функция не работает, возвращаемое значение НОЛЬ. Чтобы получить расширенную информацию об ошибке, позвоните GetLastError.
Подвести итог: почти каждая функция в WinAPI может возвращать значение, определяющее возникновение ошибки, и я могу получить информацию об ошибке когда это произойдет с помощью GetLastError функция. Но нет никакой информации о том, какие ошибки я могу ожидать и какие шаги предпринять для их устранения.
Примеров много, GetWindowRect
также широко используется и MSDN предоставляет ту же ограниченную информацию, что и для GetCursorPos
,
ВОПРОС:
Пожалуйста, существуют ли какие-либо стандарты того, как подходить к возвращаемым значениям ошибок функции WinAPI, чтобы обработка ошибок не превращалась в отображение окна сообщения и выход из приложения? Спасибо!
Поскольку заранее известно, какие возможные коды ошибок могут быть возвращены конкретной функцией, я боюсь, что Microsoft давно решила, что поддержка такой документации для всех функций будет слишком громоздкой и дорогостоящей, так как функция API может вызывать любую количество других функций API, которые в свою очередь могут вызывать другие и так далее. Иногда вам везет, и документ MSDN вызывает коды ошибок, характерные для этой функции, как в случае с ReadFile но это не относится ко всем функциям, как вы заметили.
При этом стандартный способ работы с кодами ошибок, возвращаемыми GetLastError()
это к отформатируйте их с помощью FormatMessage.
Если вы передали LANG_USER_DEFAULT для lang ID, это вернет иногда полезное, иногда не очень полезное сообщение об ошибке, отформатированное в выбранной пользователем локали из кода ошибки. Вы можете показать это сообщение пользователю. Если вы хотите отформатировать его на своем родном языке для целей ведения журнала, предполагая, что это английский, вы должны передать MAKELANGID (LANG_ENGLISH, SUBLANG_ENGLISH_US) для идентификатора языка.
И это лучшее, что вы можете сделать, если коды ошибок не задокументированы, и вы не сталкивались с ними при тестировании: зарегистрируйте их и получите журнал с другой отладочной информацией, прикрепленной к отчету о проблеме.
Других решений пока нет …