2010-11-09 149 views
11

當一個異常退出DLL中的函數時,mingw32運行時只是簡單地調用 終止 std :: unexpected而不是將該異常傳播到調用該DLL的代碼。這個問題有什麼解決方案? DLL和調用它的應用程序都使用相同的編譯器進行編譯。捕獲從DLL中拋出的異常

mingw32支持兩種不同的異常機制:SJLJ和Dwarf2。如果他們中的一個比另一個更好地工作?也許唯一的選擇是切換到MSVC或ICC,或者更改構建選項可以幫助嗎?

請注意,甚至沒有捕獲(...)將捕獲任何異常,甚至沒有內置類型(拋出1;),所以它不是關於異常類型的可見性。

+0

有趣。可能每個庫都有靜態鏈接的C++運行時? – sharptooth 2010-11-09 13:24:07

回答

0

存在接縫成爲gcc問題,當從其他共享庫引發異常時,保留有關異常類型的信息。

this bug report,並嘗試google搜索「GCC例外共享庫」(我還沒有找到一個解決這一問題)

5

是運行假設extern "C"功能絕不會拋出異常?我不熟悉MinGW,但我知道Visual Studio有一堆命令行參數來控制這種行爲。例如,/EHs選項將使其假定extern "C"永遠不會拋出,它將通過調用std::unexpected()來處理拋出的函數,後者又調用std::terminate()。您可能想要調用std::set_unexpected()來建立一個意外的異常處理程序並查看它是否陷阱。