2010-05-18 1 views
5

При написании кода Win32 C++, я был бы признателен за рекомендации по обработке ошибок API Win32.Предложения по обработке ошибок в коде Win32 C++: исключения в среде AtlThrow и STL

В частности, в случае сбоя вызова функции Win32 (например, MapViewOfFile), является его лучше:

  1. использования AtlThrowLastWin32

  2. определит Win32Exception класса, производный от станда :: exception, с добавленным членом данных HRESULT для хранения HRESULT, соответствующего значению, возвращаемому GetLastError?

В этом последнем случае, я мог бы использовать метод, что(), чтобы вернуть подробную строку ошибки (например, "не MapViewOfFile вызова в MyClass :: метод DoSomething().").

Каковы плюсы и минусы 1 против 2?

Есть ли другой лучший вариант, который мне не хватает?

В качестве побочного примечания, если я хочу локализовать компонент, который я разрабатываю, как я могу локализовать исключение what() string? Я думал о создании таблицы, отображающей исходную английскую строку, возвращаемую функцией() в строку локализованной ошибки Unicode. Может ли кто-нибудь предложить лучший подход?

Большое спасибо за ваши идеи и предложения.

ответ

5

AtlThrow не очень полезен, он выдает исключение CAtlException, которое просто обертывает код ошибки. Сбой MapViewOfFile - действительно исключительная проблема с кодом ошибки низкого уровня, который не говорит вам или вашему пользователю о том, что на самом деле пошло не так. Обработка ошибки почти всегда невозможна, маловероятно, что вы можете отмахнуться от нее и просто не использовать MMF. Вы должны будете зарегистрировать ошибку и завершить свою программу с очень общей ошибкой.

Получение подробной информации о вашем сообщении об ошибке обычно напрасно. «Ошибка вызова MapViewOfFile в методе MyClass :: DoSomething()« просто не означает ничего для вашего пользователя или ее вспомогательного персонала. Отлично для вас, что-то, чтобы проследить ошибку. Но вы можете легко автоматизировать это без проблем локализации, используя макросы __FILE__ и __LINE__. Все, что вам действительно нужно, чтобы совместить ошибку с исходным кодом.

Не забудьте короткое и быстрое сообщение об ошибке. Для ошибок Windows вы хотите использовать FormatMessage(), чтобы Windows генерировала сообщение. Он будет автоматически локализован, текст сообщения стандартизован и хорошо работает. Вывод из std :: exception в порядке. Используйте строковые идентификаторы ресурсов для настраиваемых сообщений, чтобы их можно было легко локализовать. Решает проблему().

1

Вы не должны использовать исключения для обработки ошибок. Исключения являются исключительными. Для обработки ошибок на C++ смотрите: System error support in C++0x

Смежные вопросы