雖然這個問題不僅限於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