2013-03-03 107 views
4

虽然这个问题不仅限于OpenKinect库,但它是我能想出来的最好的例子。用线程捕捉异常

在C++ Wrapper for OpenKinect中,无论何时出现问题,它都会引发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

为什么你不能处理异常?为什么不尝试/ catch围绕'(* freenect)();'呼叫? – 2013-03-04 15:57:39

+0

重点在于这是图书馆的一部分。虽然这是开源的,可以更改,但还有其他一些情况我无法更改。所以我只是想知道是否有可能使用pthreads从另一个线程捕获抛出。 – AdmiralJonB 2013-03-04 16:42:26

+1

不是直接的,没有。异常是基于堆栈的机制,也是线程特定的。如果你没有在pthread中捕捉到它们,那么这些线程将会被无声地终止。向其他线程传递异常将需要catch中的线程间通信; – 2013-03-04 19:27:04

回答

0

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

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