2011-06-06 72 views
0

我正在編譯我的程序與第三方庫。如果內部發生錯誤,該庫包含錯誤回調。在那個錯誤回調裏面,我拋出了一個異常,並且我有一個單元測試來驗證當我做了什麼無效的異常拋出。這一切都在Windows中運行得很好,但是當我在linux(fedora)中測試這個時,我得到了一個未捕獲的異常中止。從第三方靜態庫的回調中未捕獲的異常

我試着用try-catch塊直接打包我的電話,但沒有運氣。 (另外,我所有的代碼都在谷歌測試框架中運行,通常也捕獲異常)。似乎捕捉異常的唯一情況是,如果我將throw語句直接包含在錯誤回調中的try塊中。

有沒有人有任何想法,爲什麼會發生這種情況,如果有辦法趕上例外?

回答

3

當你interface with third-party libraries你通常必須抓住你的代碼和他們的代碼之間的邊界所有的異常:

int yourCallback(params) 
{ 
    try { 
     doStuff(params); 
     return Okay; 
    } catch (...) { 
     return Error; 
    } 
} 

的原因是,你不能肯定該庫是用C++或者它使用與代碼使用的C++運行時版本非常相同。

除非您完全確定代碼可以處理您的異常,否則您不能將異常傳播到第三方代碼。最極端的例子就是COM,你的代碼和「其他代碼」可以用任何語言和任何運行時,並且你不允許異常通過COM邊界傳播。

+0

好的答案,'+ 1'! – sbi 2011-06-06 14:40:16

+0

感謝您的回答,這是有道理的。 – drewag 2011-06-06 14:54:40

1

通常你不應該拋出你不知道任何關於「通過」代碼的異常。它可能是C代碼,它甚至不會自行清理。

如何處理您的具體問題需要有關您正與之連接的第三方庫的具體信息。那裏有什麼回調?給你一個修理東西的機會?通知您發生了錯誤?你可以取消它被調用的任何操作嗎?
處理這種情況的一種方法是在調用回調時在某處存儲某些信息,並在實際處理從調用該庫的函數結束時檢查該信息。

+0

我認爲這幾乎肯定是問題所在。它是一個C庫。不過,我想我只是困惑爲什麼Windows可以處理它,而Linux不? – drewag 2011-06-06 14:37:44

+0

@drewarg:不管什麼原因,你不應該依賴它 - 請花時間閱讀我鏈接到的問題的答案。 – sharptooth 2011-06-06 14:38:53

+0

@drewag:我不知道。但是通過C代碼拋出C++異常很可能會調用未定義的行爲,所以無論發生什麼都是「正確的」。 – sbi 2011-06-06 14:39:40