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

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

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


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


Ответы (2)


arrow_upward
2
arrow_downward

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

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

person zwol    schedule 30.09.2011

arrow_upward
5
arrow_downward

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