Leí un pensativo series of blog posts sobre el nuevo encabezado <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 utiliza para ajustar error_codes
s.Cómo convertir errno a excepción usando <system_error>
Lo que quiero saber es cómo convertir un error de sistema de errno
en un system_error
para poder lanzarlo. Por ejemplo, la función POSIX open
informa errores al devolver -1 y establecer 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 */;
}
}
me trataron de forma aleatoria:
errno = ENOENT;
throw std::system_error();
sino la excepción resultante devuelve ninguna información cuando what()
se llama.
Sé que podría hacer 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 su argumento, por lo que si puedo convertir errno
error_code
a continuación, el resto debería ser obvia.
Esto parece algo muy básico, así que no sé por qué no puedo encontrar un buen tutorial sobre él.
Estoy usando gcc 4.4.5 en un procesador ARM, si eso es importante.
Genial, eso funciona! Por alguna razón, en mi sistema ese mismo código acaba de mostrar "Error: sistema: 14 -" pero probablemente no estoy usando la última versión de libstdC++ o algo así. –
Para cualquier otra persona con el mismo problema, encontré que 'error.what()' devuelve una cadena vacía pero 'error.code(). Message()' devuelve una buena cadena. –
¿No puedes simplemente tirar 'std :: system_error (EFAULT, std :: system_category());' – Cubbi