c++ - 在 boost asio 中处理未处理的异常并重新启动处理的正确方法

标签 c++ exception boost-asio

在我提供的用于提升 asio 的处理程序中处理未处理异常(在提供给 recv 的回调中未处理)的正确方法是什么?

我的方法是这样的

  while (true)
    {
        try
        {
        //create listener that takes my_io_service as param
        my_io_service.run(); 
        return; //normal way to cancel processing
        }
        //catches
        //after catches:
        lock_guard<mutex> _(running_mtx);
        if ( ! my_io_service.stopped())  // one A pointed ! here is wrong
            my_io_service.reset();
        // and after this we go back to the beginning of the while loop :)
    }

然后我像这样停止 my_io_service:

    void stopListening()
    {
        lock_guard<mutex> _(running_mtx);
        if ( ! my_io_service.stopped())
            my_io_service.stop();
}

最佳答案

我不是很清楚你的意思。但据我了解,您想知道抛出的异常而不是传递给处理程序的错误代码,对吗?在这种情况下,trycatch 确实有效,但如果您只想确保不会出现 io_service.run() 的异常(而不是例如那些在处理程序中生成的),你也可以使用非抛出重载:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/io_service/run/overload2.html

boost::system::error_code ec;
my_io_service.run(ec);

现在您不会通过该行获得任何异常,但您可能应该在之后检查 ec,因为通常会导致抛出异常的任何错误都将存储在那里。此 ec 与传递给您的处理程序的 error_code 无关,它指示异步操作的进行方式(而 .run 执行其操作作业),而如果 .run 本身遇到任何问题,则会设置此任务。

编辑:如果您关心处理程序中抛出的异常,您应该在其中放置一个 try catch block ,以便根据需要处理它们。例如,您可能想要开始一个新的异步操作。

关于c++ - 在 boost asio 中处理未处理的异常并重新启动处理的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21308553/

相关文章:

c++ - cin N 个元素到 vector C++

c++ - 能否在 O(n) 中识别和量化字符串中的重复字符?

c++ - 使用泛型类指针作为参数声明函数指针的正确语法是什么?

c++ - SDL2,创建比屏幕大的窗口

c# - 有没有办法处理无法访问的异​​常?

c++ - 是否可以在按值捕获后检测异常切片?

wcf - 客户端中的 FaultException 处理?

c++ - Boost::asio 和 async_read

c++ - Boost asio async_write_some 泄漏?

c++ - 在 boost async_receive_from 上定义超时