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!