/EH (例外處理模型)
指定編譯器所使用的例外處理模型,以及終結會因例外狀況而超出範圍的 C++ 物件。 如果沒有指定 /EH,編譯器會攔截結構化例外狀況和 C++ 例外狀況,但不會終結因例外狀況而超出範圍的 C++ 物件。
/EH{s|a}[c][-]
引數
a
會攔截非同步 (結構化) 例外狀況以及同步 (C++) 例外狀況的例外處理模型。s
只會攔截 C++ 例外狀況,並告知編譯器要假設 extern C 函式確實會擲回例外狀況的例外處理模型。c
如果搭配使用 s (/EHsc),便只會攔截 C++ 例外狀況,並會告知編譯器假設 extern C 函式永遠不會擲回 C++ 例外狀況。 /EHca 相當於 /EHa。
備註
請使用 /EHs,指定同步例外處理模型 (沒有結構化例外處理例外的 C++ 例外處理)。 如果使用 /EHs,則您的 catch 子句就不會攔截非同步的 (Asynchronous) 例外狀況 (Exception)。 而且,產生非同步例外狀況時,即使處理了非同步例外狀況,也不會終結範圍中的所有物件。 在 /EHs 之下,catch(...) 只會攔截 C++ 例外狀況。 存取違規和 System.Exception 例外狀況將不會被攔截。
請使用 /EHa 指定非同步例外狀況處理模型 (具有結構化例外處理例外狀況的 C++ 例外狀況處理)。 /EHa 可能會產生效能低落的影像,因為即使編譯器看不到擲回,也不會一樣積極地最佳化 try 區塊。
如果要攔截用 throw 以外項目引發的例外狀況,請使用 /EHa。 下列範例會產生例外狀況:
// compiler_options_EHA.cpp
// compile with: /EHa
#include <iostream>
#include <excpt.h>
using namespace std;
void fail() { // generates SE and attempts to catch it using catch(...)
try {
int i = 0, j = 1;
j /= i; // This will throw a SE (divide by zero).
printf("%d", j);
}
catch(...) { // catch block will only be executed under /EHa
cout<<"Caught an exception in catch(...)."<<endl;
}
}
int main() {
__try {
fail();
}
// __except will only catch an exception here
__except(EXCEPTION_EXECUTE_HANDLER) {
// if the exception was not caught by the catch(...) inside fail()
cout << "An exception was caught in __except." << endl;
}
}
/EHc 選項必須已指定 /EHs 或 /EHa。 使用 /clr (Common Language Runtime 編譯),隱含 /EHa (/clr /EHa 是多餘的)。 如果在 /clr 之後使用 /EHs[c],編譯器會產生錯誤。 最佳化將會影響這種行為。 攔截到例外狀況時,編譯器會叫用類別解構函式或與例外狀況相同範圍中一個或多個物件的解構函式。 如果未攔截到例外狀況,這些解構函式不會執行。
如需在 /clr 之下,關於例外處理之限制的詳細資訊,請參閱 _set_se_translator。
選項可以透過符號 - 加以清除。 例如,/EHsc- 是解譯為 /EHs /EHc-,而相當於 /EHs。
如需詳細資訊,請參閱Exception Handling: Default Synchronous Exception Model。
在 Visual Studio 開發環境中設定這個編譯器選項
開啟專案的 [屬性頁] 對話方塊。 如需詳細資訊,請參閱 HOW TO:開啟專案屬性頁。
按一下 [C/C++] 資料夾。
按一下 [程式碼產生] 屬性頁。
修改 [啟用 C++ 例外狀況] 屬性。
另外,您也可使用下列程序:
在 Visual Studio 開發環境中設定這個編譯器選項
按一下 [C/C++] 資料夾。
按一下 [程式碼產生] 屬性頁。
將 [啟用 C++ 例外狀況] 設定為 [否]。
按一下 [命令列] 屬性頁。
在 [其他選項] 方塊中,輸入編譯器選項。