2012-08-29 11 views
44

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

Respuesta

49

Está en el camino correcto, sólo tiene que pasar el código de error y un objeto std::system_category a la std::system_errorconstructor y debería funcionar:

Ejemplo:

#include <iostream> 
#include <system_error> 

int main() 
{ 
    try 
    { 
     throw std::system_error(EFAULT, std::system_category()); 
    } 
    catch (std::system_error& error) 
    { 
     std::cout << "Error: " << error.code() << " - " << error.what() << '\n'; 
    } 
} 

La salida del programa anterior en mi sistema es

 
Error: system:14 - Bad address 
+0

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í. –

+3

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

+4

¿No puedes simplemente tirar 'std :: system_error (EFAULT, std :: system_category());' – Cubbi

Cuestiones relacionadas