Вы должны придумать код ошибки и категорию, чтобы создать объект 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 есть решение для распространения исключений по потокам.
Надеюсь, поможет!
person
Community
schedule
30.09.2011