С++ 11 представил заголовок <system_error>, содержащий общую систему для обработки кодов ошибок. std::error_code - это кортеж, содержащий int, код ошибки и ссылку на std::error_category, которая определяет домен ошибки и обработку кода ошибки. Стандартная библиотека состоит из четырех категорий: std::generic_category, std::system_category, std::future_category и std::iostream_category.
Существуют конфликты, по которым будет использоваться категория как на SO и на сайтах С++ при создании std::error_code s/throwing std::system_error с кодом errno и WinAPI:
-
errnoсstd::generic_category: SO ответ, llvm-commits, cplusplus.com -
errnoсstd::system_category: SO ответ, cppreference.com -
GetLastError()сstd::generic_category: Ответ SO -
GetLastError()сstd::system_category: SO ответ, комментарий SO <
Однако errno и GetLastError() не могут использовать одну и ту же категорию, в противном случае некоторые коды ошибок будут неоднозначными. Код ошибки 33 является одним из примеров, так как он является как EDOM и ERROR_LOCK_VIOLATION.
Есть даже некоторые места, защищающие пользовательскую категорию для WinAPI, но на данный момент я не могу найти ссылок на это. Эта альтернатива была бы особенно болезненной.
Какую категорию следует использовать с errno и которая должна использоваться с GetLastError(), чтобы
-
std::error_code::default_error_condition() -
std::error_code::message()
являются несимметричными и соответствуют основному коду ошибки?