当io_service被线程化时,Boost.Asio中的异常处理

时间:2012-11-05 12:45:54

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

如果一个应用程序只有一个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场景。

1 个答案:

答案 0 :(得分:3)

没有什么神奇的事情发生。如果您在某处捕获异常,那么您的catch块会处理它。否则,未捕获的异常将终止该过程。

你应该如何处理它取决于你想要发生什么。如果异常永远不会发生,那么让它终止进程。如果你想吃掉或处理异常,那么写一个函数将io_service::run包裹在try / catch块中并让线程运行它。

我不喜欢把智能放在远离代码的地方。我首选的解决方案是永远不要让我的异步函数抛出异常,除非有一个真正致命的错误。如果异步函数知道如何处理它可能抛出的异常,那么它应该捕获它。

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