LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 192|回复: 0

处理 C++ 中的结构性异常

[复制链接]
发表于 2024-2-6 23:05:06 | 显示全部楼层 |阅读模式
C 结构化异常处理 (SEH) 和 C++ 异常处理的主要区别是,C++ 异常处理模型处理的是多个类型,而 C 结构化异常处理模型处理的是一个类型(具体来说就是 unsigned int)的异常。 即,C 异常由无符号整数值标识,而 C++ 异常由数据类型标识。 当 C 中引发了结构化异常时,每个可能的处理程序都将执行筛选器来检查 C 异常上下文,并确定是接受该异常、将其传递给其他处理程序还是忽略它。 当 C++ 中引发了异常时,该异常可以是任何类型。

第二个区别是,C 结构化异常处理模型被称为是“异步的”,因为异常是从属在正常控制流之后发生的。 C++ 异常处理机制是完全“同步的”,这意味着异常仅在被引发时发生。

使用 /EHs 或 /EHsc 编译器选项时,C++ 异常处理程序均不会处理结构化异常。 这些异常仅由 __except 结构化异常处理程序或 __finally 结构化终止处理程序进行处理。 有关详细信息,请参阅结构化异常处理 (C/C++)。

在 /EHa 编译器选项下,如果在 C++ 程序中引发了 C 异常,可以由结构化异常处理程序与其关联筛选器一起处理,或者由 C++ catch 处理程序进行处理,具体取决于哪一种更加动态接近异常上下文。 例如,此示例 C++ 程序在 C++ try 上下文中引发了一个 C 异常:

// exceptions_Exception_Handling_Differences.cpp
// compile with: /EHa
#include <iostream>

using namespace std;
void SEHFunc( void );

int main() {
   try {
      SEHFunc();
   }
   catch( ... ) {
      cout << "Caught a C exception."<< endl;
   }
}

void SEHFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
   }
   __finally {
      cout << "In finally." << endl;
   }
}
Output

In finally.
Caught a C exception.

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表