使用Pthreads捕获异常

时间:2013-03-03 19:21:37

标签: c++ pthreads openkinect

虽然这个问题并不局限于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;
}

我的问题很简单:是否有可能以某种方式捕捉这些错误并处理它们?

通常,我会处理异常,或者重写代码:我不喜欢因为异常导致程序崩溃,如果我知道它们可能发生,我宁愿干净利落地处理它们。有些图书馆做了类似的事情,我无法重写,因此我就来问这个问题。

1 个答案:

答案 0 :(得分:0)

您必须更清楚地定义线程的职责。我猜它通过某种管道或并发队列将一些消息提供给其他线程。在这种情况下,只需更改消息类以存储异常信息(std :: exception_ptr)。当您访问消息中的数据时,首先检查是否包含异常;如果是这样,请调用std :: rethrow_exception()。

在std :: future()中使用了类似的机制;要么得到()承诺的值,要么在尝试这样做时引发异常,这来自另一个线程。搜索std :: async()示例以查看它的实际效果。