2017-06-12 129 views
1

boost::asio::io_service::run()在发生错误时会抛出boost::system::system_error异常。我应该处理这个异常吗?如果是这样,怎么样?应该引发boost :: asio :: io_service :: run()引发的异常吗?

我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; 
} 
+0

这一切都依赖。如果有的话,你能从中恢复吗?你也知道如何捕捉异常吗? – NathanOliver

+0

@NathanOliver在异步设置中,特别是关于了解许多流程之一中的异常是否应该停止整个多路复用服务。在90%的情况下,这是不期望的。常规控制流程不适用于处理器模型 – sehe

回答

4

是。

记录了从完成处理程序抛出的异常是否被传播。因此,您需要根据您的应用程序处理它们。

在很多情况下,这将循环并重复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

+0

添加了代码示例和文档链接 – sehe