código de error vs condición de error

3 minutos de lectura

Avatar de usuario de Lesswire
menos alambre

No entiendo muy bien por qué necesitamos hacer una distinción entre el código de error (std::error_code) y un error condition(std::error_condition), no son lo mismo? ¿Cuáles son las ventajas de una condición de error frente a un código de error?

Avatar de usuario de Jimbo
Jimbo

De http://en.cppreference.com/w/cpp/error/error_condition

std::error_condition es un código de error independiente de la plataforma. Al igual que std::error_code, se identifica de forma única por un valor entero y std::error_category, pero a diferencia de std::error_code, el valor no depende de la plataforma.

Entonces, la ventaja es que su código de error no es específico de la plataforma en la que está trabajando cuando usa std::error:condition.

Con un std::error_code

Cada objeto std::error_code contiene un par de códigos de error que se originan en el sistema operativo o alguna interfaz de bajo nivel

Entonces el error_code hará referencia a algo específico de su plataforma, una pieza de hardware, etc.

Puede ser ventajoso usar ambos. El error_condition es la “abstracción portátil”, por lo que sería el mensaje de error genérico para dar al usuario y al error_code sería la información dependiente de la plataforma que sería útil para la depuración específica.

Una implementación típica [of error_condition] contiene un miembro de datos entero (el valor) y un puntero a std::error_category.

Avatar de usuario de Marat Abrarov
marat abrarov

La respuesta más simple a esta pregunta que encontré aquí: http://blog.think-async.com/2010/04/system-error-support-in-c0x-part-5.html.

  • clase std::error_code – representa un valor de error específico devuelto por una operación (como una llamada al sistema).
  • clase std::error_condition – algo que desea probar y, potencialmente, reaccionar en su código.

Creo que también es aplicable para C++ 11.

Avatar de usuario de Dwayne Robinson
robinson

Una buena denominación tiene un gran impacto en la comprensión. Con el zoológico de cosas erróneas con nombres muy similares introducido en C++ 11…

std::errc            - an error code
std::error_code      - a different error code?
std::error_condition - yet another kind of error code 🤔
std::error_category  - a utility helper interface for error codes 😵

… Tuve que hacer un mapa mental solo para ordenarlos a todos:

std::errc              -> std::posix_error_code
std::error_code        -> std::platform_dependent_error
std::error_condition   -> std::platform_independent_error
std::error_category    -> std::error_domain/utility/mapper
std::system_category   -> std::platform_dependent_error_domain
std::generic_category  -> std::platform_independent_error_domain
std::future_errc       -> std::future_error_code
std::future_category   -> std::future_error_domain
std::io_errc           -> std::iostream_error_code
std::iostream_category -> std::iostream_error_domain

Ambos errores dependientes de la plataforma y errores independientes de la plataforma sostenga un código y un puntero a un clase auxiliar de utilidad para asignar esos códigos de error específicos del dominio a un mensaje. A pesar de tener interfaces casi idénticas {asignar, borrar, valor, mensaje…}, no heredan de una clase base común, lo que significa que no puede llamar genéricamente a uno u otro método. 🤦‍♂️

Observa eso std::error_code no es un código de error, sino una combinación de código de error + más dominio/categoría, mientras que std::errc es un actual código de error (un valor numérico). Buenas ideas – nombres horribles 🙃.

¿Ha sido útil esta solución?