当io_service被螺纹时,在boost.asio中进行异常处理

Exception handling in Boost.Asio when io_service is threaded

本文关键字:asio boost 异常处理 io service      更新时间:2023-10-16

如果应用程序只有一个 io_service对象并且是螺纹的(请参见下面的代码),如果一个异步处理程序中的一位抛出异常,会发生什么。它如何传播,更重要的是,什么是处理它们的最佳方法。

std::list< boost::shared_ptr< the_client > > clients_list;
for(int i = 0; i < n_threads; i++)
{
    clients_list.insert(boost::make_shared< the_client >( io_service, server_host, server_port ));
}
for(unsigned int i = 0; i < n_threads; i++)
{
    threads.create_thread(boost::bind(&boost::asio::io_service::run, boost::ref(io_service)));
}
for(std::list< boost::shared_ptr< the_client > >::iterator itr = clients_list.begin(); itr != clients_list.end(); ++itr)
{
    (*itr)->connect_to_server_and_run_statemachine();
}

此处the_client::connect_to_server_and_run_statemachine()设置了与服务器的连接并启动异步连接处理。

我知道一个关于类似主题的问题,但这不考虑多线程IO_Service方案。

什么都没有发生。如果您在某个地方捕获异常,则catch块处理它。否则,未被发现的例外终止了该过程。

应该如何处理它取决于您想发生的事情。如果不应该发生例外,请让它终止该过程。如果您想吃或处理异常,请编写一个将io_service::run包装在try/catch块中的函数,然后将线程运行。

我不喜欢将情报远离代码。我首选的解决方案是,除非有真正的致命错误,否则永远不要使我的异步功能抛出异常。如果异步函数知道如何处理可能会抛出的异常,则应抓住它。

但是,如果在您的应用程序中有意义,请包装run是完全可以接受的。