|
若要编写可移植代码,建议不要在 C++ 程序中使用结构化异常处理 (SEH)。 但是,你有时可能希望使用 /EHa 进行编译并将结构化异常和 C++ 源代码组合在一起,并且需要用于处理这两种异常的某个设备。 由于结构化异常处理程序没有对象或类型化异常的概念,因此它无法处理 C++ 代码引发的异常。 但是,C++ catch 处理程序可以处理结构化异常。 C 编译器不接受 C++ 异常处理语法(try、throw、catch),但 C++ 编译器支持结构化异常处理语法(__try、__except、__finally)。
若要了解如何将结构化异常作为 C++ 异常处理,请参阅 _set_se_translator。
如果混合使用结构化异常和 C++ 异常,请注意以下潜在问题:
不能在同一函数中混合 C++ 异常和结构化异常。
始终执行终止处理程序(__finally 块),甚至在引发异常后的展开过程中也是如此。
C++ 异常处理可以捕获并保留使用 /EH 编译器选项(此选项启用展开语义)编译的所有模块中的展开语义。
可以存在一些不为所有对象调用析构函数的情况。 例如,尝试通过未初始化的函数指针调用函数时,可能会出现结构化异常。 如果函数参数是在调用之前构造的对象,则在堆栈展开期间不会调用这些对象的析构函数。
|
|