簡體   English   中英

MSVC - / EHsc vs / EHa(同步與異步異常處理)

[英]MSVC - /EHsc vs /EHa (synchronous vs asynchronous exception handling)

你能列出實際差異/暗示的子彈清單嗎? 我閱讀了相關的MSDN文章,但我理解異步異常仍然有點模糊。

我正在使用Boost.Test編寫測試套件,我的編譯器發出警告,應該啟用EHa:

警告C4535:調用_set_se_translator()需要/ EHa

項目本身僅使用普通異常(來自STL)並且不需要/ EHa切換。 我是否必須使用/ EHa開關重新編譯它以使測試套件正常工作? 我的感覺是我只需要/ EHa參加測試。

當您使用/ EHsc時,編譯器只會在檢測到try {}塊中包含的代碼可能拋出C ++異常時才會為異常過濾器發出代碼。 異常過濾器確保在處理異常時解除堆棧時調用任何本地C ++對象的析構函數。 它使RAII工作。

這是x86代碼的優化,空間和時間,x64代碼的空間。 空間因為它可以省略異常過濾器代碼,這是適度的btw。 時間因為在x86上它可以避免在進入try {}塊時注冊異常過濾器。 非常溫和的順便說一句。 x64使用不同的方式查找異常過濾器,它是基於表的。

第一段中的關鍵短語是“可能拋出C ++異常”。 在Windows上還有其他異常來源。 與/ EHa中的“a”類似,硬件引發異步異常。 像浮點異常,除零和強大的訪問沖突異常之類的東西。 但也值得注意的是,您可能與之交互的代碼引發的異常類型。 與托管代碼一樣,基本上是在VM中運行的任何內容。

如果你想讓你的對象對這些異常安全,那么你需要使用/ EHa,它告訴編譯器總是注冊異常過濾器。

要注意/ EHa的令人討厭的副作用,它會使catch(...)吞噬所有異常。 包括你不應該捕捉的那些,比如AV和SO。 看看__try/__except和_set_se_translator(),如果這對你很重要的話。

好吧,沒有/ EHa你就無法捕捉到意想不到的異常,所以你的測試程序會異常退出。

如果可以進行異常退出測試,最好不要與EHa搏斗。

此外,將選項更改為/ EHa會產生許多副作用,包括增加可執行文件大小和性能下降。 因此有效地改變了原始行為

使用或不使用/ EHa是一個通常在程序設計階段做出的重大決定。

恕我直言,測試用例寫作中的問題對於改變這個決定是微不足道的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM