提升,异常,线程和异步,我应该如何处理它们?

时间:2012-05-05 07:05:25

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

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

throw(来自async_read类)调用的那些函数Client提供了catch,谁将获得Server例外? {{1}}?如果是这样,有没有办法忽视错误并恢复正常执行?。

1 个答案:

答案 0 :(得分:3)

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

<强>摘要: “如果从处理程序抛出异常,则允许异常通过抛出线程调用run(),run_one(),poll()或poll_one()进行传播。没有其他调用这些函数的线程受到影响。应用程序有责任捕获异常。“

因此,这取决于您拥有catch声明的位置。

<强>更新

异常工作的一般方式是,在出现错误时,创建错误的函数将throw异常。任何调用函数都必须try它调用的worker函数,并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
}