【问题标题】:Boost, exceptions, threads and asynchrony, how should I handle them?Boost、异常、线程和异步,我应该如何处理它们?
【发布时间】:2012-05-14 15:22:50
【问题描述】:

我有许多不同的线程 (boost::thread_pool) 到 boost::asio::io_service。 io_service 将调用一个函数,该函数将触发 async_read,该函数将触发另一个 async_read,从中可以调用许多函数。这一切都在两个类中完成:线程从 Server 类产生,async_read 从 Client 类调用。

如果我从async_read(来自Client 类)调用的那些函数中提供throw,那么谁将获得catch 异常? Server?如果是这样,有什么方法可以忽略错误并恢复正常执行?

【问题讨论】:

    标签: c++ multithreading exception boost boost-asio


    【解决方案1】:

    您是否阅读过 Boost.Asio manual 的这一部分?

    总结: “如果从处理程序中抛出异常,则允许异常通过抛出线程对 run()、run_one()、poll() 或 poll_one() 的调用传播。没有其他调用这些函数的线程受到影响. 然后由应用程序负责捕获异常。”

    所以这取决于您的catch 声明的位置。

    更新

    异常工作的一般方式是,一旦出现错误,创建错误的函数将throw 异常。任何调用函数都必须 try 它调用的工作函数和 catch 异常来解决错误。或者,您可以将捕获的异常(或任何其他异常)重新抛出到链上更高的任何调用函数。

    void some_function()
    {
        // do some work
    
        if (error_occurred) 
            // don't know context, so pass the buck to calling function
            throw std::exception;
    }
    
    void some_calling_function()
    {
        try {
            some_function(); // could throw
        } catch (std::exception& e) {
            // do some error handling depending in context
        }
        // code will resume here
    }
    

    【讨论】:

    • 请添加可在此链接中找到的内容的摘要,或解决 OP 问题的代码示例:如果我保存此页面并离线阅读,您的回答一文不值:x
    • @MatthieuM。总结不错,但没有来自 OP 的代码,我如何提供解决他问题的代码?
    • 嗯,这是一个一般指导方针,因此 or :) +1 花时间更新你的答案。
    • 您有关于从异常中恢复和恢复执行的方法的任何信息吗?
    • @JulianBayardoSpadafora 查看我的更新答案和cplusplus.com/reference/std/exception/exception
    猜你喜欢
    • 2013-09-10
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多