虽然这个问题不仅限于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;
}
我的问题很简单:是否有可能以某种方式捕获这些错误并处理它们?通常,我会处理异常,或重写代码:我不喜欢让程序因为异常而崩溃,如果我知道它们可能发生,我宁愿处理它们。有一些图书馆做类似的事情,我不能重写,所以我来问这个问题。
为什么你不能处理异常?为什么不尝试/ catch围绕'(* freenect)();'呼叫? – 2013-03-04 15:57:39
重点在于这是图书馆的一部分。虽然这是开源的,可以更改,但还有其他一些情况我无法更改。所以我只是想知道是否有可能使用pthreads从另一个线程捕获抛出。 – AdmiralJonB 2013-03-04 16:42:26
不是直接的,没有。异常是基于堆栈的机制,也是线程特定的。如果你没有在pthread中捕捉到它们,那么这些线程将会被无声地终止。向其他线程传递异常将需要catch中的线程间通信; – 2013-03-04 19:27:04