【发布时间】:2013-03-03 19:21:36
【问题描述】:
虽然这个问题不仅限于 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;
}
我的问题很简单:是否有可能以某种方式捕获这些错误并处理它们?
通常,我会处理异常,或者重写代码:我不喜欢程序因为异常而崩溃,如果我知道它们可能会发生,我宁愿干净地处理它们。有一些库做了类似的事情,我无法重写,因此我来问这个问题。
【问题讨论】:
-
为什么不能处理异常?为什么不尝试/捕获'(*freenect)();'打电话?
-
重点是这是图书馆的一部分。虽然这个是开源的并且可以更改,但在其他情况下我无法更改它。所以我只是想知道是否可以使用 pthreads 捕获另一个线程的抛出。
-
不直接,不。异常是基于堆栈的机制,因此是特定于线程的。如果您没有在 pthreads 中捕获它们,线程将被静默终止。将异常传达给其他线程将需要在 catch{} 中进行线程间通信;
标签: c++ pthreads openkinect