c++ - badalloc - Casos de uso para std:: error_code
format exception c++ (1)
Me lo pregunté hace un tiempo y encontré la respuesta here . Esencialmente, error_code
se utiliza para almacenar y transportar códigos de error, mientras que error_condition
se usa para hacer coincidir los códigos de error.
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();
}
Cada error_condition
es equivalente a un conjunto de error_code
, posiblemente de diferentes error_categories
. De esta manera, puede tratar todos los errores de un determinado tipo de la misma forma, sin importar de qué subsistema se originen.
error_code
por otro lado, contiene exactamente la categoría del subsistema desde el cual se originó. Esto es útil para la depuración y cuando se informa del error: es posible que le interese saber si un error de "permiso denegado" se debió a derechos de acceso insuficientes en el sistema de archivos local o a un error 403 que recibió de su http-downloader-library. y puede querer poner ese detalle en el mensaje de error, pero su programa debe abortar de cualquier manera.
Lo que constituye equivalencia es definido por las categorías; si la categoría error_condition
considera el error_condition
equivalente, o la categoría error_code
considera el error_code
equivalente, entonces el operator==
devuelve true
para ese par de error_condition
y error_code
. De esa manera, puede tener error_code
s de su propia categoría de error y hacerlos equivalentes a ciertas condiciones de error genéricas o del sistema.
Últimamente, he estado convirtiendo algunas bibliotecas para usar las instalaciones de <system_error>
en C ++ 11.
Estoy teniendo dificultades para entender los casos de uso de std::error_code
vs. std::error_condition
.
Tenga en cuenta que comprendo la diferencia : hay muchas preguntas sobre stackoverflow que superan la diferencia.
La diferencia básica es que se supone que std::error_code
representa un error específico del sistema o la plataforma, mientras que std::error_condition
es un error abstracto que debe devolver una API o una interfaz de usuario.
Bien, pero me cuesta entender por qué std::error_code
en la práctica. Me parece que vas a:
Trate con un mecanismo de informe de errores específico del sistema (como, por ejemplo,
errno
o algo devuelto por una llamada POSIX, o por ejemplo, una llamada agetsockopt
conSO_ERROR
en Linux) que puede convertir fácilmente en unastd::error_condition
través destd::errc
errc, que se supone que son portátiles.Utilice una categoría de errores definidos por el usuario, que representan errores a nivel de aplicación o lógica de negocios, como "número de seguridad social no válido" o lo que sea, lo que también sería un caso de uso para
std::error_condition
.Trate con alguna interfaz o biblioteca de bajo nivel que defina su propio mecanismo de informe de errores, como OpenSSL, en cuyo caso estaría utilizando directamente mecanismos de error específicos de la plataforma. En este caso, entonces necesitaría convertir o asignar estos errores a un
std::error_code
. Pero si va a pasar por el problema de convertir estos errores específicos de la plataforma en algo genérico comostd::error_code
, ¿por qué no convertir simplemente astd::error_condition
?
Además, dado que se supone que los errores del sistema POSIX son portátiles y que se asignan uno a uno con std::error_condition
través de la enumeración std::errc
, no puedo encontrar ningún caso de uso para std::error_code
. La mayoría de las llamadas al sistema Linux / UNIX establecen errno
, que se supone que debe asignarse de manera portátil a std::error_condition
.
Por lo tanto, no veo ningún caso de uso para std::error_code
ningún lugar. Entonces, ¿cuáles son algunos casos de uso de ejemplo en los que nos gustaría usar std::error_code
lugar de std::error_condition
?