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

В записи Win32 кода C++ я ценил бы некоторые подсказки, как обработать ошибки API Win32.

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

  1. используйте AtlThrowLastWin32

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

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

Каковы за и против 1 по сравнению с 2?

Есть ли какой-либо другой более оптимальный вариант, который я пропускаю?

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

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

5
задан EmbeddedProg 18 May 2010 в 17:09
поделиться

2 ответа

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

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

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

5
ответ дан 14 December 2019 в 08:44
поделиться

Не следует использовать исключения для обработки ошибок. Исключения бывают исключительными. Информацию об обработке ошибок C ++ см .: Поддержка системных ошибок в C ++ 0x

2
ответ дан 14 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: