Варианты использования для std :: error_code

В последнее время я конвертировал некоторые библиотеки, чтобы использовать <system_error> средства в C ++ 11.

Мне трудно понять варианты использования для std::error_code против std::error_condition,

Заметка, Я понимаю разницу — имеются много вопросов по stackoverflow которые идут на разницу.

Основное отличие состоит в том, что std::error_code должен представлять системную или платформенную ошибку, тогда как std::error_condition является абстрактной ошибкой, которую должен вернуть API или пользовательский интерфейс.

Хорошо, но у меня проблемы с пониманием, почему мы будем когда-либо использовать std::error_code на практике. Мне кажется, вы либо собираетесь:

  1. Иметь дело с системным механизмом сообщения об ошибках (например,
    сказать, errno или что-то, возвращенное из вызова POSIX, или, скажем, вызов
    в getsockopt с SO_ERROR на Linux), который вы можете легко
    преобразовать в std::error_condition через std::errc перечисления, которые должны быть переносимыми.

  2. Использовать пользовательскую категорию ошибок, которые представляют уровень приложения
    или ошибки бизнес-логики, такие как «неверный номер социального страхования» или
    что бы то ни было — что также будет использовать для
    std::error_condition,

  3. Работайте с каким-либо низкоуровневым интерфейсом или библиотекой, которая определяет собственный механизм сообщения об ошибках, например 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?

16

Решение

Я задавался вопросом об этом некоторое время назад сам и нашел ответ Вот. По существу, 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_codes из вашей собственной категории ошибок и сделать их эквивалентными определенному универсальному или системному error_conditions.

16

Другие решения

этот блог охватывает то, что вам нужно

и вы также можете прочитать это «Ваш собственный код ошибки»

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector