Использовать случаи для std:: error_code
В последнее время я конвертировал некоторые библиотеки для использования объектов <system_error>
в С++ 11.
Мне трудно понять варианты использования для std::error_code
vs. std::error_condition
.
Заметьте, Я понимаю разницу - есть qaru.site/info/249020/..., которые переходят на разницу.
Основное отличие состоит в том, что std::error_code
предполагается представлять ошибку системы или платформы, тогда как std::error_condition
является абстрактной ошибкой, возвращаемой API или пользовательским интерфейсом.
Хорошо, но мне трудно понять, почему мы когда-либо использовали std::error_code
на практике. Мне кажется, вы либо собираетесь:
-
Работайте с системным механизмом отчетности об ошибках (например,
скажем, errno
или что-то, возвращаемое с помощью вызова POSIX или, например, вызов
до getsockopt
с SO_ERROR
в Linux), который вы можете легко
конвертировать в std::error_condition
через перечисления std::errc
, которые должны быть переносимыми.
-
Использовать определенную пользователем категорию ошибок, которые представляют собой уровень приложения
или бизнес-логические ошибки, такие как "недопустимый номер социального страхования" или
независимо от того, что также было бы прецедентом для
std::error_condition
.
-
Обращайтесь к некоторому низкоуровневому интерфейсу или библиотеке, которая определяет свой собственный механизм отчетности об ошибках, такой как OpenSSL, и в этом случае вы будете напрямую использовать механизмы ошибок на платформе. В этом случае вам нужно будет преобразовать или сопоставить эти ошибки с std::error_code
. Но если вы столкнетесь с проблемой превращения этих ошибок конкретной платформы в нечто общее, например std::error_code
, почему бы просто не преобразовать в std::error_condition
?
Кроме того, поскольку системные ошибки POSIX должны быть переносимыми, и поскольку они сопоставляются друг с другом с помощью std::error_condition
с помощью перечисления std::errc
, я не могу найти вариант использования для std::error_code
. В большинстве системных вызовов Linux/UNIX устанавливается errno
, который предположительно переносится на std::error_condition
.
Итак, я ничего не вижу в случае использования std::error_code
. Итак, каковы некоторые примеры использования, когда мы хотели бы использовать std::error_code
вместо std::error_condition
?
Ответы
Ответ 1
Мне было интересно об этом некоторое время назад и нашел ответ здесь. По существу, error_code
используется для хранения и передачи кодов ошибок, а error_condition
используется для соответствия кодов ошибок.
void handle_error(error_code code) {
if (code == error_condition1) do_something();
else if(code == error_condition2) do_something_else();
else do_yet_another_thing();
}
Каждый error_condition
эквивалентен набору error_code
, возможно, из разных error_categories
. Таким образом, вы можете обрабатывать все ошибки определенного типа одинаково, независимо от того, из какой подсистемы они происходят.
error_code
, с другой стороны, содержит точно ту категорию подсистемы, из которой она возникла. Это полезно для отладки и сообщения об ошибке: вам может быть интересно узнать, была ли ошибка отказа в разрешении из-за недостаточных прав доступа в локальной файловой системе или из-за ошибки 403, полученной вашей почтой-загрузчиком http-загрузчика, и может захотеть поместить эту деталь в сообщение об ошибке, но ваша программа должна прервать любой путь.
То, что составляет эквивалентность, определяется категориями; если категория error_code
считает эквивалент error_condition
, или, категория error_condition
считает эквивалент error_code
, тогда operator==
возвращает true
для этой пары error_condition
и error_code
. Таким образом, вы можете иметь error_code
из своей собственной категории ошибок и сделать их эквивалентными некоторым общим или системным error_condition
s.
Ответ 2
этот блог охватывает то, что вам нужно
и вы также можете прочитать это Свой собственный код ошибки