2011-09-30 14 views

Respuesta

5

Debe crear el código y la categoría de error para crear el objeto error_code. He aquí un ejemplo, suponiendo que el error se debe a otra conexión de host negarse:

error_code ec (errc::connection_refused, system_category()); 
return ec; 

También puede pasar errno valor como código de error cuando se utiliza la categoría del sistema. Por ejemplo:

#include <fstream> 
#include <cerrno> 
#include <boost/system/system_error.hpp> 

void foo() 
{ 
    ifstream file ("test.txt"); 
    if (!file.is_open()) 
    { 
     int err_code = errno; 
     boost::system::error_code ec (err_code 
      , boost::system::system_category()); 
     throw boost::system::system_error (ec, "cannot open file"); 
    } 
} 

Por desgracia, esta biblioteca es poco documented, por lo que recomiendo que se ocupe de header files de entender las cosas. El código es bastante simple y sencillo allí.

Por si su compilador admite C++ 11 y está dispuesto a usarlo, esta funcionalidad se convirtió en estándar. Por lo que sé, gcc 4.6.1 ya lo tiene. Aquí está un ejemplo sencillo:

#include <cerrno> 
#include <system_error> 

std::error_code 
SystemError::getLastError() 
{ 
    int err_code = errno; 
    return std::error_code (err_code, std::system_category()); 
} 

void foo() 
{ 
    throw std::system_error (getLastError(), "something went wrong"); 
} 

En general, las bibliotecas pasan error_code objeto en torno a si no hay necesidad de tirar y usar system_error a lanzar una excepción que describe los fallos del sistema. Otra razón para usar error_code sin excepciones es cuando necesita señalar el error en diferentes subprocesos. Pero C++ 11 tiene a solution for propagating exceptions across threads.

Espero que ayude!

Cuestiones relacionadas