Предложения по обработке ошибок кода Win32 C ++: AtlThrow против STL исключений - PullRequest
5 голосов
/ 18 мая 2010

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 19 мая 2010

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

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

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

1 голос
/ 18 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...