В последнее время я конвертировал некоторые библиотеки, чтобы использовать <system_error>
средства в C ++ 11.
Мне трудно понять варианты использования для std::error_code
против std::error_condition
,
Заметка, Я понимаю разницу — имеются много вопросов по stackoverflow которые идут на разницу.
Основное отличие состоит в том, что 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
enum, я не могу найти ни одного варианта использования для std::error_code
, Большинство системных вызовов Linux / UNIX установлено errno
, который должен переноситься в std::error_condition
,
Итак, я не вижу ни одного варианта использования для std::error_code
в любом месте. Итак, каковы некоторые примеры использования, где мы хотели бы использовать std::error_code
вместо std::error_condition
?
Я задавался вопросом об этом некоторое время назад сам и нашел ответ Вот. По существу, 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-downloader, и может захотеть поместить эту деталь в сообщение об ошибке, но ваша программа должна прервать работу в любом случае.
Что составляет эквивалентность, определяется категориями; если error_code
категория считает error_condition
эквивалент, или же error_condition
категория считает error_code
эквивалентно, то operator==
возвращается true
для этой пары error_condition
а также error_code
, Таким образом, вы можете иметь error_code
s из вашей собственной категории ошибок и сделать их эквивалентными определенному универсальному или системному error_condition
s.
этот блог охватывает то, что вам нужно
и вы также можете прочитать это «Ваш собственный код ошибки»