with try runtime_error example clase catch c++ exception c++11

c++ - try - Cómo convertir errno a excepción usando<system_error>



std exception (1)

Leí una serie <system_error> de publicaciones de blog sobre el nuevo <system_error> en C ++ 11. Dice que el encabezado define una clase error_code que representa un valor de error específico devuelto por una operación (como una llamada al sistema). Dice que el encabezado define una clase system_error , que es una clase de excepción (hereda de runtime_exception ) y se usa para ajustar los error_codes s.

Lo que quiero saber es cómo convertir realmente un error del sistema de errno en un system_error para poder lanzarlo. Por ejemplo, la función de open POSIX informa errores al devolver -1 y al configurar errno , por lo que si deseo lanzar una excepción, ¿cómo debo completar el código a continuación?

void x() { fd = open("foo", O_RDWR); if (fd == -1) { throw /* need some code here to make a std::system_error from errno */; } }

Intenté al azar:

errno = ENOENT; throw std::system_error();

pero la excepción resultante no devuelve información cuando se llama a what() .

Sé que podría throw errno; pero quiero hacerlo de la manera correcta, usando el nuevo encabezado <system_error> .

Hay un constructor para system_error que toma un solo error_code como argumento, así que si solo puedo convertir errno en error_code , el resto debería ser obvio.

Esto parece algo realmente básico, así que no sé por qué no puedo encontrar un buen tutorial sobre eso.

Estoy usando gcc 4.4.5 en un procesador ARM, si eso importa.


Está en el camino correcto, simplemente pase el código de error y un objeto std::system_error constructor std::system_error y debería funcionar.

Ejemplo:

#include <assert.h> #include <errno.h> #include <iostream> #include <system_error> int main() { try { throw std::system_error(EFAULT, std::generic_category()); } catch (std::system_error& error) { std::cout << "Error: " << error.code() << " - " << error.what() << ''/n''; assert(error.code() == std::errc::bad_address); } }

La salida del programa anterior en mi sistema es

Error: generic:14 - Bad address