混合使用 C(结构化)和 C++ 异常

若要编写可移植代码,建议不要在 C++ 程序中使用结构化异常处理 (SEH)。 但是,你有时可能希望使用 /EHa 进行编译并将结构化异常和 C++ 源代码组合在一起,并且需要用于处理这两种异常的某个设备。 由于结构化异常处理程序没有对象或类型化异常的概念,因此它无法处理 C++ 代码引发的异常。 但是,C++ catch 处理程序可以处理结构化异常。 C 编译器不接受 C++ 异常处理语法(trythrowcatch),但 C++ 编译器支持结构化异常处理语法(__try__except__finally)。

若要了解如何将结构化异常作为 C++ 异常处理,请参阅 _set_se_translator

如果混合使用结构化异常和 C++ 异常,请注意以下潜在问题:

  • 不能在同一函数中混合 C++ 异常和结构化异常。

  • 始终执行终止处理程序(__finally 块),甚至在引发异常后的展开过程中也是如此。

  • C++ 异常处理可以捕获并保留使用 /EH 编译器选项(此选项启用展开语义)编译的所有模块中的展开语义。

  • 可以存在一些不为所有对象调用析构函数的情况。 例如,尝试通过未初始化的函数指针调用函数时,可能会出现结构化异常。 如果函数参数是在调用之前构造的对象,则在堆栈展开期间不会调用这些对象的析构函数。

后续步骤

另请参阅

现代 C++ 处理异常和错误的最佳做法