#include<stdio.h>
class A
{
public:
A() {printf(" 构造一个 A 对象 \n");}
~A() {printf(" 析构一个 A 对象 \n");}
void f1() {}
void f2() {}
};
void main()
{
__try
{
A a1, a2;
puts("in try");
}
__except(puts("in filter 1"), 1)
{
puts("in except 1");
}
}
/*
--------------------Configuration: exception - Win32 Debug--------------------
Compiling...
seh-test.cpp
f:\exception\seh-test.cpp(214) : warning C4509: nonstandard extension used: 'main' uses SEH and 'a2' has destructor
f:\exception\seh-test.cpp(211) : see declaration of 'a2'
f:\exception\seh-test.cpp(214) : warning C4509: nonstandard extension used: 'main' uses SEH and 'a1' has destructor
f:\exception\seh-test.cpp(211) : see declaration of 'a1'
f:\exception\seh-test.cpp(219) : error C2712: Cannot use __try in functions that require object unwinding
Error executing cl.exe.
Creating browse info file...
exception.exe - 1 error(s), 2 warning(s)
那原因就是: 同样还是由于在一个函数不能采用两种形式的异常处理机制而导致的编译错误。
啊!这岂不是更迷惑了。其实不然,说穿了,朋友们就会明白了,
这是因为: 在 C++ 异常处理模型中,为了能够在异常发生后,
保证正确地释放相关的局部变量(也即调用析构函数),
它必须要跟踪每一个“对象”的创建过程,
这种由于异常产生而导致的对象析构的过程,
被称为“ unwind ”(记得前面的内容中,也多次讲述到了这个名词),因此,
如果一个函数中有局部对象的存在,
那么它就一定会存在 C++ 的异常处理机制(也即会给此函数插入一些用于 C++ 异常处理“代码和信息”),
这样,如果该函数中在再使用 try-except 机制,
岂不是就冲突了吗?所以编译器也就报错了,
因为它处理不了了!
*/