Какое значение `boost :: system :: error_code` должно быть предоставлено при сбое` boost :: asio :: ip :: tcp :: resolver :: resolve () `?

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

Что нужно вернуть?


person 0xbadf00d    schedule 30.09.2011    source источник


Ответы (2)


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

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

person zwol    schedule 30.09.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 есть решение для распространения исключений по потокам.

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

person Community    schedule 30.09.2011