С++ 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()
являются несимметричными и соответствуют основному коду ошибки?