2016-11-30 41 views
0

我有使用第三方庫的代碼。如何在C++中捕獲錯誤__try __except不能

該庫引發偶爾的訪問衝突異常。一個基本的try/catch沒有發現錯誤,程序很難崩潰。

我能夠使用__try __except來代替錯誤,記錄它,然後正常退出程序。

第三方剛剛更新了自己的圖書館,現在該是導致訪問衝突錯誤記錄的一小部分只是死在生產帶有「[程序名稱]已停止工作」

在Visual Studio中,當步進通過我得到「Microsoft Visual Studio C運行時庫已經在[程序名稱]中檢測到一個致命錯誤。」

我已經更新了我的__except語句來捕捉所有事情(或者我相信),它仍然會發生。

原始__except:

__except (eps = GetExceptionInformation(), ((GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) 
       ? EXCEPTION_EXECUTE_HANDLER 
       : EXCEPTION_CONTINUE_SEARCH)) { 
     sprintf("error message"); 
     result = 99; 
} 

新__except:

__except (eps = GetExceptionInformation(), ((1 == 1) 
       ? EXCEPTION_EXECUTE_HANDLER 
       : EXCEPTION_CONTINUE_SEARCH)) { 
     sprintf("error message"); 
     result = 99; 
} 

回答

0

只是一個友好的僅供參考,你的異常過濾器eps = GetExceptionInformation()第一表達似乎未被使用。

此外,如果您想要捕獲所有異常,那麼__except (EXCEPTION_EXECUTE_HANDLER)應該是您所需要的。雖然我只會建議用於調試目的。

如果這不能捕捉到您的異常,庫可能會嘗試處理異常本身以及庫中本身正在發生的奇怪事情。我會與圖書館的提供者覈實並詢問這是否是已知問題。

+0

感謝您的建議,我嘗試了 __except(EXCEPTION_EXECUTE_HANDLER) 結果與其他兩個相同。我已經問了第三方,但是他們的時間框架對於修復來說往往太長了,這就是爲什麼我必須首先處理他們的訪問衝突。 –

+0

你有權訪問他們的符號和源代碼嗎?你能夠在他們的最終調試它來弄清楚異常是如何發生的嗎?如果即使使用__except(EXCEPTION_EXECUTE_HANDLER),異常也不會被捕獲,那麼我的直覺就是庫試圖處理異常,所以你的代碼永遠不會得到它。 –

+0

不幸的是我沒有訪問權限。我對開發者提出了一個問題,引用了示例記錄的行爲,以及新行爲之前/之後的版本號,聽起來像我可能會被卡住,直到我聽到回聲。感謝您的幫助。 –