Вам нужно придумать код ошибки и категорию, чтобы создать error_code
объект. Вот пример, предполагающий, что ошибка связана с другим хостом, отказывающим в соединении:
error_code ec (errc::connection_refused, system_category());
return ec;
Вы также можете передать значение errno
в качестве кода ошибки при использовании системной категории. Например:
#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");
}
}
К сожалению, эта библиотека плохо документирована , поэтому я могу порекомендовать вам заглянуть в заголовочные файлы , чтобы разобраться. Код довольно прост и понятен.
На тот случай, если ваш компилятор поддерживает C ++ 11 и вы готовы его использовать, эта функциональность превратила его в стандарт. Насколько я знаю, у gcc 4.6.1 это уже есть. Вот простой пример:
#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");
}
Как правило, библиотеки передают объект error_code
, если нет необходимости генерировать, и используют system_error
для выдачи исключения, описывающего сбои системы. Другая причина использовать error_code
без исключений - это когда вы должны сигнализировать об ошибке в разных потоках. Но в C ++ 11 есть решение для распространения исключений по потокам .
Надеюсь, это поможет!