|
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.
|
|