4

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

4

1 回答 1

3

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

你应该如何处理它取决于你想要发生什么。如果异常永远不会发生,则让它终止进程。如果您想处理或处理异常,请编写一个包含io_service::runtry/catch块中的函数,并让线程运行它。

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

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

于 2012-11-05T12:47:39.370 回答