Я разрабатываю библиотеку, которая взаимодействует с удаленной системой, и хотя она возвращает конечное и известное количество кодов ошибок, сообщения могут изменяться непредсказуемым образом.
Так что я исследование std::error_code
как способ предоставить пользователям моей библиотеки способ обработки ошибок, свойственных C ++, вместо развертывания собственного кода. Я не могу бросать исключения.
Учебники на использование std::error_category
всегда показывать, что статический экземпляр используется с жестко закодированными сообщениями, возвращаемыми в зависимости от кода ошибки.
Но что, если у нас есть динамические сообщения, которые нельзя кэшировать? Как мы можем связать конкретное сообщение с конкретным экземпляром std::error_code
?
Короткий ответ: вы не можете этого сделать.
error_code
предназначен для копирования типа значения. Если бы пользовательские сообщения были разрешены, копирование ошибки потребовало бы глубокого копирования данных сообщения или ведения подсчета ссылок.
Это сделало бы коды ошибок слишком тяжелыми для использования во многих внутренних циклах приложений / библиотек, в основном вынуждая программистов использовать другой механизм обработки ошибок для этой части кода, рендеринг error_code
по сути бессмысленно.
Вы можете обойти это, используя локальное состояние ошибки потока (как в старой школе). errno
), но я бы порекомендовал против этого, так как это предотвратит сохранение ошибок в течение любого промежутка времени.
Других решений пока нет …