将boost(asio)错误消息翻译成自然语言

时间:2018-12-25 21:55:38

标签: c++ boost c++14 boost-asio

boost::system::error_code具有转换为字符串功能,可以方便地给我打印一些内容。不幸的是,它通常类似于“ system:9”,但并不太有用。从阅读源看来,数字是按枚举建立的,因此我可以测试特定条件,但不太容易知道遇到了哪种条件。

似乎将error_condition.value()传递到perror() / strerror()确实可行,但是我还没有找到能保证这一点的文档。我错过了吗?我应该更怀疑吗?

我主要是出于怀疑,因为我不明白为什么operator<<()打印的字符串如果可以保证不能正常工作,而不仅仅是使用strerror()

2 个答案:

答案 0 :(得分:2)

您可能应该只使用system::error_code::message()

void foo(boost::system::error_code ec) {
     std::cout << "foo called (" << ec.message() << ")\n";
}

运算符<<必须适用于所有类别-设计上无限制,因此这就是为什么仅显示类别名称的原因。

答案 1 :(得分:1)

我在项目中使用了类似的方法,使错误报告的内容更加丰富:

#include <boost/system/error_code.hpp>
#include <ostream>
#include <iostream>


struct report
{
    report(boost::system::error_code ec) : ec(ec) {}

    void operator()(std::ostream& os) const
    {
        os << ec.category().name() << " : " << ec.value() << " : " << ec.message();
    }

    boost::system::error_code ec;

    friend std::ostream& operator<<(std::ostream& os, report rep)
    {
        rep(os);
        return os;
    }
};



int main()
{
    auto ec = boost::system::error_code(EINTR, boost::system::system_category());
    std::cout << "the error is : " << report(ec) << '\n';
}

示例输出:

the error is : system : 4 : Interrupted system call

http://coliru.stacked-crooked.com/a/91c02689f2ca74b2