В записи Win32 кода C++ я ценил бы некоторые подсказки, как обработать ошибки API Win32.
В частности, в случае отказа вызова функции Win32 (например, MapViewOfFile), это лучше к:
используйте AtlThrowLastWin32
определите класс Win32Exception, полученный из станд.:: исключение, с добавленным элементом данных HRESULT для хранения соответствия HRESULT для оценки возвращенный GetLastError?
В этом последнем случае я мог использовать, что () метод для возврата подробной строки ошибки (например, "Вызов MapViewOfFile перестал работать в MyClass:: DoSomething () метод".).
Каковы за и против 1 по сравнению с 2?
Есть ли какой-либо другой более оптимальный вариант, который я пропускаю?
Как примечание стороны, если я хотел бы локализовать компонент, я разрабатываю, как я мог локализовать исключение, что () представляет в виде строки? Я думал о создании таблицы, отображающей исходную английскую строку, возвращенную тем, что () в Unicode локализовало строку ошибки. Кто-либо мог предложить лучший подход?
Большое спасибо за Ваше понимание и предложения.
AtlThrow не очень полезен, он выбрасывает CAtlException, который просто обертывает код ошибки. Сбой MapViewOfFile - это действительно исключительная проблема с низкоуровневым кодом ошибки, который не говорит ни вам, ни вашему пользователю, что именно пошло не так. Обработка ошибки почти всегда невозможна, вряд ли вы сможете отмахнуться от нее и просто не использовать MMF. Вам придется записать ошибку в журнал и завершить свою программу с очень общей ошибкой.
Очень подробное сообщение об ошибке обычно является напрасной тратой усилий. "MapViewOfFile call failed in MyClass::DoSomething() method" просто ничего не значит для вашего пользователя или его службы поддержки. Хотя для вас это здорово - есть, где отследить ошибку. Но это можно легко автоматизировать без проблем с локализацией, используя макросы __FILE__
и __LINE__
. Все, что вам действительно нужно, чтобы сопоставить ошибку с исходным кодом.
Делайте сообщение об ошибке коротким и отрывистым. Для ошибок Windows лучше использовать FormatMessage(), чтобы позволить Windows сгенерировать сообщение. Оно будет автоматически локализовано, текст сообщения стандартизирован и хорошо гуглится. Производные от std::exception - это нормально. Используйте идентификаторы строковых ресурсов для пользовательских сообщений, чтобы их можно было легко локализовать. Это также решает проблему what().
Не следует использовать исключения для обработки ошибок. Исключения бывают исключительными. Информацию об обработке ошибок C ++ см .: Поддержка системных ошибок в C ++ 0x