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