【问题标题】:How to properly unwrap error code from boost exception如何从 boost 异常中正确解包错误代码
【发布时间】:2018-06-29 15:32:58
【问题描述】:

这个问题很简单,但我不知道该怎么做。我想获取 system_error,然后从那里获取具体的错误代码。我在错误中有这样的东西:

Dynamic exception type: boost::exception_detail::clone_impl<boost::exception_detail::current_exception_std_exception_wrapper<std::runtime_error> >
std::exception::what:
boost::system::system_error

我可以直接捕获boost::exception,但不能直接捕获std::runtime_errorboost::system_error

try {

        this->service_.run();
    }
    catch (boost::system::system_error const & e) {
                i_->playerLog->info("Exiting with system error. Error code: {} -- What: {}", e.code().value(),
                                    e.what());
            }
 catch (boost::exception const & e) {
    i_->playerLog->info("Exiting with boost exception: {}", boost::diagnostic_information(e));
 }

我的代码将进入 boost::exception 子句,但不会进入 system_error 或 runtime_erro

【问题讨论】:

  • 异常的根源是什么?
  • 好问题...我猜它来自 boost.asio。不过代码相当复杂。
  • 你怎么知道它不会捕获std::runtime_error?我问只是因为显示的代码没有明确的catch 子句。
  • @G.M.是的,它正在捕获std::runtime_error,我刚刚尝试过。我想我可以 dynamic_cast 到 boost::system_error 并从那里解开。
  • 可能会提供有用的信息以在成功捕获该事物的某些 catch 子句中打印出typeid(e).name()

标签: c++ boost exception-handling


【解决方案1】:

这应该没问题:

Live On Coliru

#include <boost/asio.hpp>
#include <iostream>

int main() {
    try {
        using namespace boost::asio;
        io_service svc;
        ip::tcp::acceptor a(svc);
        a.open(ip::tcp::v4());

        a.bind({{}, 22}); // error, need admin privs
    } catch(boost::system::system_error const& e) {
        std::cout << e.what() << ": " << e.code() << " - " << e.code().message() << "\n";
    }
}

打印

bind: Permission denied: system:13 - Permission denied

如果没有,通常您会混合使用类型信息不匹配的动态加载库。

奖金

为了完整起见,使用更详细的异常信息进行了测试:Live On Coliru

【讨论】:

    猜你喜欢
    • 2020-04-05
    • 2013-01-10
    • 2011-12-29
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多