badalloc c++ c++11 error-code

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:

  1. 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 a getsockopt con SO_ERROR en Linux) que puede convertir fácilmente en una std::error_condition través de std::errc errc, que se supone que son portátiles.

  2. 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 .

  3. 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 como std::error_code , ¿por qué no convertir simplemente a std::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 ?