Подтвердить что ты не робот

Использовать случаи для 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?

4b9b3361

Ответ 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.