Какое значение `boost :: system :: error_code` должно быть указано при сбое` boost :: asio :: ip :: tcp :: resolver :: resol () `? - PullRequest
7 голосов
/ 30 сентября 2011

Я хочу вернуть boost::system::error_code указание, может ли быть разрешен хост / служба или нет.Может быть несколько причин, по которым поиск узла / службы не удался (например, проблемы с сетевым подключением или неверный аргумент).

Что должно быть возвращено?

Ответы [ 2 ]

5 голосов
/ 01 октября 2011

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

Надеюсь, это поможет!

2 голосов
/ 01 октября 2011

Невозможно получить это право извне resolve().Но вы можете заставить его сделать это за вас, используя одну из перегрузок, которая принимает error_code& в качестве выходного параметра:

и затем возвращает код ошибки, который он устанавливает.Я верю, что это будет завершено errno или h_errno в зависимости от ситуации.

...