Вы пропустили метод: возвращаете индикацию ошибки и запрашиваете дополнительный вызов для получения подробностей об ошибке.
Для этого многое можно сказать.
Пример:
int count;
if (!TryParse("12x3", &count))
DisplayError(GetLastError());
edit
Этот ответ вызвал немало споров и недовольства.Честно говоря, меня совершенно не убеждают несогласные аргументы.Отделение , если произошел успешный вызов от , почему сбой оказался очень хорошей идеей .Объединение этих двух факторов приводит к следующему шаблону:
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();
edit
Просмотр запроса R.Я нашел сценарий, в котором он действительно может быть удовлетворен.
Для универсального API в стиле C, такого как функции Windows SDK, который я использовал в моих примерах, не существует неглобальныхконтекст для кодов ошибок, чтобы остаться. Вместо этого у нас нет хорошей альтернативы использованию глобального TLV, который можно проверить после сбоя.
Однако, если мы расширим тему, чтобы включить методы в классе, ситуацияdiffereнт.Совершенно разумно, учитывая переменную reg
, которая является экземпляром класса RegistryKey
, для вызова reg.Open
для возврата false
, требующего от нас затем вызвать reg.ErrorCode
для получения подробностей.
Я полагаю, что это удовлетворяет запросу Р. о том, что код ошибки должен быть частью контекста, поскольку экземпляр обеспечивает контекст.Если вместо RegistryKey
экземпляра мы вызовем статический Open
метод для RegistryKeyHelper
, то извлечение кода ошибки при сбое также должно быть статическим, что означает, что это должен быть TLV, хотяне совсем глобальный.Класс, в отличие от экземпляра, будет контекстом.
В обоих этих случаях ориентация объекта обеспечивает естественный контекст для хранения кодов ошибок.Сказав это, если бы не было естественного контекста, я бы по-прежнему настаивал на глобальном, вместо того, чтобы пытаться заставить вызывающую сторону передать выходной параметр или какой-то другой искусственный контекст или вернуть код ошибки напрямую.