Вы пропустили метод: возврат сообщения об ошибке и необходимость дополнительного вызова для получения сведений об ошибке.
Об этом можно много сказать.
Пример:
int count;
if (!TryParse("12x3", &count))
DisplayError(GetLastError());
редактировать
Этот ответ вызвал немало споров и голосов против. Откровенно говоря, меня совершенно не убеждают противоположные аргументы. Разделение успешности вызова и причины неудачи оказалось действительно хорошей идеей. Объединение этих двух сил в следующую схему:
HKEY key;
long errcode = RegOpenKey(HKEY_CLASSES_ROOT, NULL, &key);
if (errcode != ERROR_SUCCESS)
return DisplayError(errcode);
Сравните это с:
HKEY key;
if (!RegOpenKey(HKEY_CLASSES_ROOT, NULL, &key))
return DisplayError(GetLastError());
(Версия GetLastError согласуется с тем, как в целом работает Windows API, но версия, которая возвращает код напрямую, работает именно так, поскольку API реестра не соответствует этому стандарту.)
В любом случае я бы предположил, что шаблон возврата ошибок позволяет слишком легко забыть о почему функция не удалось, что приводит к такому коду, как:
HKEY key;
if (RegOpenKey(HKEY_CLASSES_ROOT, NULL, &key) != ERROR_SUCCESS)
return DisplayGenericError();
редактировать
Посмотрев на запрос Р., я нашел сценарий, при котором он действительно может быть удовлетворен.
Для универсального API в стиле C, такого как функции Windows SDK, которые я использовал в своих примерах, нет неглобального контекста для кодов ошибок. Вместо этого у нас нет хорошей альтернативы использованию глобального TLV. что можно проверить после сбоя.
Однако, если мы расширим тему, включив в нее методы класса, ситуация изменится. Совершенно разумно, учитывая переменную reg
, которая является экземпляром класса RegistryKey
, для вызова reg.Open
, чтобы вернуть false
, требуя затем вызвать reg.ErrorCode
для получения деталей.
Я считаю, что это удовлетворяет запрос R. о том, чтобы код ошибки был частью контекста, поскольку экземпляр предоставляет контекст. Если вместо экземпляра RegistryKey
мы вызвали статический метод Open
на RegistryKeyHelper
, то получение кода ошибки при сбое также должно быть статическим, что означает, что это должен быть TLV, хотя и не полностью глобальный. Класс, в отличие от экземпляра, будет контекстом.
В обоих случаях ориентация объекта обеспечивает естественный контекст для хранения кодов ошибок. Сказав это, если нет естественного контекста, я бы все равно настаивал на глобальном, в отличие от попытки заставить вызывающего абонента передать выходной параметр или какой-либо другой искусственный контекст или напрямую вернуть код ошибки.
person
Steven Sudit
schedule
08.07.2010