如果一个应用程序只有一个 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()
设置与服务器的连接并启动异步连接处理。
我知道一个 question on a similar topic ,但这并未考虑多线程 io_service 场景。
最佳答案
没有什么神奇的事情发生。如果您在某处捕获异常,则您的 catch
block 会处理它。否则,未捕获的异常会终止进程。
您应该如何处理它取决于您希望发生什么。如果永远不会发生异常,则让它终止进程。如果你想吃掉或处理异常,然后编写一个函数,将 io_service::run
包装在 try
/catch
block 中,并让线程运行它。
我不喜欢让智能远离代码。我首选的解决方案是永远不要让我的异步函数抛出异常,除非存在真正致命的错误。如果异步函数知道如何处理它可能抛出的异常,那么它应该捕获它。
但是,如果在您的应用程序中有意义,包装 run
是完全可以接受的。
关于c++ - 线程化 io_service 时 Boost.Asio 中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13232412/