/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 子句将不会捕获异步异常。 此外,在范围内,当生成异步异常时,即使处理了异步异常也不会销毁范围内的所有对象。 在 /EHs 下,catch(...) 仅捕获 C++ 异常。 将不捕获访问冲突和 System.Exception 异常。

使用 /EHa 指定异步异常处理模型(具有结构化异常处理异常的 C++ 异常处理)。 /EHa 可能导致映像性能较差,因为编译器不会积极地优化 try 块,即使编译器没有发现 throw 也是如此。

如果希望捕获由 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(公共语言运行时编译)暗指 /EHa/clr /EHa 是冗余的)。 如果在 /clr 后使用 /EHs[c],则编译器将生成一个错误。 优化不会影响此行为。 当捕获异常时,编译器将为与该异常在同一范围内的对象调用类析构函数。 如果未捕获异常,则不会运行这些析构函数。

有关 /clr 下的异常处理限制的信息,请参见 _set_se_translator

可以使用符号 - 清除该选项。 例如,/EHsc- 解释为 /EHs /EHc- 并且等价于 /EHs

有关更多信息,请参见Synchronous Exception Handling

在 Visual Studio 开发环境中设置此编译器选项

  1. 打开项目的**“属性页”**对话框。 有关详细信息,请参见如何:打开项目属性页

  2. 单击**“C/C++”**文件夹。

  3. 单击**“代码生成”**属性页。

  4. 修改**“启用 C++ 异常”**属性。

或者,也可以使用以下过程:

在 Visual Studio 开发环境中设置此编译器选项

  1. 单击**“C/C++”**文件夹。

  2. 单击**“代码生成”**属性页。

  3. 将**“启用 C++ 异常”设置为“否”**。

  4. 单击**“命令行”**属性页。

  5. 在**“附加选项”**框中键入编译器选项。

以编程方式设置此编译器选项

请参见

参考

编译器选项

设置编译器选项

异常规范