使用Pthreads捕获异常

4

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

在OpenKinect的C++封装中,每当出现问题时,它都会抛出一个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;
}

我的问题很简单:能否以某种方式捕获这些错误并处理它们?
通常,我会处理异常或重写代码:如果我知道异常可能发生,我不喜欢程序崩溃,我宁愿干净地处理它们。有一些类库做着类似的事情,但我无法重写它们,这就是为什么我问这个问题的原因。

为什么你不能处理这些异常呢?在“(*freenect)();”调用周围加上一个try/catch语句块不行吗? - Martin James
整个重点在于这是库的一部分。虽然这个是开源的并且可以更改,但有些情况我不能改变它。所以我只是想知道是否可能使用pthread来捕获来自另一个线程的抛出。 - AdmiralJonB
1
不是直接的,异常是一种基于堆栈的机制,因此是线程特定的。如果您没有在pthread中捕获它们,则线程将会悄悄地终止。在catch{}中向其他线程传递异常将需要通过线程间通信进行。 - Martin James
1个回答

0

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

类似的机制在std::future()中使用;要么从中获取承诺的值,要么在尝试这样做时引发来自其他线程的异常。搜索std::async()示例以查看其实际操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接