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