c++ - 线程化 io_service 时 Boost.Asio 中的异常处理

标签 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 场景。

最佳答案

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

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

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

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

关于c++ - 线程化 io_service 时 Boost.Asio 中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13232412/

相关文章:

c++ - 智能指针以及当它们破坏它们指向的对象时

c++ - 有没有一种方法可以自动生成或至少缩短(例如__all__之类的参数)序列化函数?

java - 具有 Web 服务的应用程序中异常处理的最佳方式

python - python中的异常

c++ - 如何在C++中安全地将 double 型转换为整数?

c++ - 这是 C++ 中的聚合初始化还是默认初始化?

c++ - 分解模板参数包操作

c++ - 如何通过 Boost C++ 库与 3D 多边形相交?

c++ - Boost C++ - 生成一个介于 0 和 1 之间的随机实数

c# - 在 C# 中传播在 finally block 中抛出的异常而不丢失 catch block 中的异常的最佳实践是什么?