4

虽然这个问题不仅限于 OpenKinect 库,但它是我能想出的最好的例子来展示它。

在 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;
}

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

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

4

1 回答 1

0

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

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

于 2013-03-20T22:14:13.850 回答