在处理回调函数时,处理异常的常用方法是什么?

时间:2011-11-23 17:31:47

标签: 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);
  }
}

问题是Parse可能会抛出异常。处理这些异常的常用C ++方法是什么?我应该以某种方式“移交”处理函数的异常吗?

2 个答案:

答案 0 :(得分:8)

新的C ++ 11标准支持许多工具来简化线程编程。

在您的情况下,最有趣的是std::futurestd::promise

请注意std::promise::set_exception_*功能。它允许您在其原始线程之外引用异常(注意std::exception_ptr具有共享指针语义)。您可以使用std::current_exception()(在catch语句中)获取所需的指针。

然后注意std::future::get函数:如果从promise中提取future有一个异常而不是一个值,那么它将抛出异常。

这是将异常从一个线程引导到另一个线程的机制。

答案 1 :(得分:1)

上次我做了类似的事情时,我使用了一个单独的回调函数,它接受std::exception const &进行异常处理。你需要警惕对象的生命周期。