【问题标题】:Should the exception thrown by boost::asio::io_service::run() be caught?boost::asio::io_service::run() 抛出的异常是否应该被捕获?
【发布时间】:2017-11-14 00:16:20
【问题描述】:

boost::asio::io_service::run() 抛出一个boost::system::system_error 异常以防出错。我应该处理这个异常吗?如果有,怎么做?

我的 main.cpp 代码是这样的:

main()
{
    boost::asio::io_service queue;
    boost::asio::io_service::work work(queue);
    {
      // set some handlers...
      **queue.run();**
    }
    // join some workers...
    return 0;
}

【问题讨论】:

  • 这一切都取决于。如果是这样,你能从中恢复吗?你也知道如何捕捉异常吗?
  • @NathanOliver 在异步设置中,尤其是关于了解多个流之一中的异常是否应该停止整个多路复用服务。在 90% 的情况下,这是不希望的。正则控制流不适用于前摄器模型

标签: c++ boost exception-handling boost-asio


【解决方案1】:

是的。

据记载,完成处理程序抛出的异常会被传播。因此,您需要根据您的应用程序来处理它们。

在许多情况下,这会循环并重复 run(),直到它退出且没有错误。

在我们的代码库中,我有类似的东西

static void m_asio_event_loop(boost::asio::io_service& svc, std::string name) {
    // http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.effect_of_exceptions_thrown_from_handlers
    for (;;) {
        try {
            svc.run();
            break; // exited normally
        } catch (std::exception const &e) {
            logger.log(LOG_ERR) << "[eventloop] An unexpected error occurred running " << name << " task: " << e.what();
        } catch (...) {
            logger.log(LOG_ERR) << "[eventloop] An unexpected error occurred running " << name << " task";
        }
    }
}

这是文档链接http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.effect_of_exceptions_thrown_from_handlers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多