我有一个非阻塞函数(它立即返回),它创建一个新线程来解析一些数据:
boost::any Parse() throw(ParseException) {
// parse something
}
typedef void (*HandlerFunc)(boost::any result);
void ParseAsync(HandlerFunc handler) {
Parser me(*this);
in_new_thread {
boost::any result = me.Parse();
handler(result);
}
}
问题是Parse
可能会抛出异常。处理这些异常的常用C ++方法是什么?我应该以某种方式“移交”处理函数的异常吗?
答案 0 :(得分:8)
新的C ++ 11标准支持许多工具来简化线程编程。
在您的情况下,最有趣的是std::future
和std::promise
。
请注意std::promise::set_exception_*
功能。它允许您在其原始线程之外引用异常(注意std::exception_ptr
具有共享指针语义)。您可以使用std::current_exception()
(在catch
语句中)获取所需的指针。
然后注意std::future::get
函数:如果从promise
中提取future
有一个异常而不是一个值,那么它将抛出异常。
这是将异常从一个线程引导到另一个线程的机制。
答案 1 :(得分:1)
上次我做了类似的事情时,我使用了一个单独的回调函数,它接受std::exception const &
进行异常处理。你需要警惕对象的生命周期。