1 c++ exception-handling callback c++11
我有一个非阻塞函数(它立即返回),它创建一个新线程来解析一些数据:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是Parse可以抛出异常.处理这些异常的常用C++方法是什么?我应该以某种方式"移交"处理函数的异常吗?
新的C++ 11标准支持许多工具来简化线程编程.
在你的情况下,最有趣的是std::future和std::promise.
注意这个std::promise::set_exception_*功能.它允许您在其原始线程之外引用异常(注意std::exception_ptr具有共享指针语义).您可以使用std::current_exception()(在catch语句中)获取所需的指针.
然后注意std::future::get函数:如果从中提取promise的future是异常而不是值,那么它将抛出异常.
这是将异常从一个线程引导到另一个线程的机制.