categorias <system_error> e códigos de erro padrão / do sistema
C ++ 11 introduziu o<system_error>
cabeçalho contendo um sistema genérico para manipular códigos de erro. Astd::error_code
é uma tupla contendo umint
, o código de erro e uma referência a umstd::error_category
, que define o domínio do erro e a manipulação do código de erro. A biblioteca padrão vem com quatro categorias:std::generic_category
, std::system_category
, std::future_category
estd::iostream_category
.
Existem conflitos sobre qual categoria usar, aqui nos sites de referência SO e C ++, ao criarstd::error_code
s / jogandostd::system_error
s comerrno
e códigos de erro do WinAPI:
errno
comstd::generic_category
: Então responde, llvm-commits, cplusplus.comerrno
comstd::system_category
: Então responde, cppreference.comGetLastError()
comstd::generic_category
: Então respondeGetLastError()
comstd::system_category
: Então responde, Comentário SOContudo,errno
eGetLastError()
não pode usar a mesma categoria; caso contrário, alguns códigos de erro seriam ambíguos. O código de erro 33 é um exemplo, pois é ambosEDOM
eERROR_LOCK_VIOLATION
.
Existem até alguns lugares que defendem uma categoria criada pelo usuário para o WinAPI, mas não consigo encontrar nenhuma referência a isso no momento. Essa alternativa seria especialmente dolorosa.
Qual categoria deve ser usada comerrno
e que deve ser usado comGetLastError()
de modo a
std::error_code::default_error_condition()
std::error_code::message()
são inequívocos e adequados ao código de erro subjacente?