В последнее время я конвертировал некоторые библиотеки для использования объектов <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
?