虽然这个问题并不局限于OpenKinect Libraries,但这是我能想出来的最佳例子。
在OpenKinect的C ++ Wrapper中,每当出现错误时,都会抛出runtime_error异常。这个例子来自libfreenect.hpp。该线程是在类的构造函数中创建的。
// Do not call directly, thread runs here
void operator()() {
while(!m_stop) {
if(freenect_process_events(m_ctx) < 0) throw std::runtime_error("Cannot process freenect events");
}
}
static void *pthread_callback(void *user_data) {
Freenect* freenect = static_cast<Freenect*>(user_data);
(*freenect)();
return NULL;
}
我的问题很简单:是否有可能以某种方式捕捉这些错误并处理它们?
通常,我会处理异常,或者重写代码:我不喜欢因为异常导致程序崩溃,如果我知道它们可能发生,我宁愿干净利落地处理它们。有些图书馆做了类似的事情,我无法重写,因此我就来问这个问题。
答案 0 :(得分:0)
您必须更清楚地定义线程的职责。我猜它通过某种管道或并发队列将一些消息提供给其他线程。在这种情况下,只需更改消息类以存储异常信息(std :: exception_ptr)。当您访问消息中的数据时,首先检查是否包含异常;如果是这样,请调用std :: rethrow_exception()。
在std :: future()中使用了类似的机制;要么得到()承诺的值,要么在尝试这样做时引发异常,这来自另一个线程。搜索std :: async()示例以查看它的实际效果。