1 void ExceptTest2()
2 {
3 int i = 0;
4 int *p = NULL;
5 __try
6 {
7 __try
8 {
9 __try
10 {
11 __try
12 {
13 __try
14 {
15 *p = 1; //1.这里引发异常
16 i = 10;
17 }
18 __finally
19 {
20 i = 11; //4.全局展开第一步
21 }
22 }
23 __finally
24 {
25 i = 8; //5.全局展开第二步
26 }
27 i = 9; //这里不会被执行,因为全局展开完成后,将执行异常处理代码
28 }
29 __except (EXCEPTION_CONTINUE_SEARCH)//2.过滤器返回EXCEPTION_CONTINUE_SEARCH,继续向上层查找
30 {
31 i = 1; //因为过滤器表明不处理异常,所以这里也不会被执行
32 }
33
34 i = 2; //这里不会被执行,因为全局展开完成后,将执行异常处理代码
35
36 __try
37 {
38 i = 5; //这里不会被执行,因为全局展开完成后,将执行异常处理代码
39 }
40 __finally
41 {
42 i = 6; //这里不会执行(因为其对应的__try块中没有代码被执行)
43 }
44 }
45 __finally
46 {
47 i = 35; //6.全局展开第三步
48 }
49 }
50 __except(EXCEPTION_EXECUTE_HANDLER) //3.找到了异常处理块,开始全局展开
51 {
52 i = 20; //6.执行异常处理代码
53 }
54 i=10; //7.异常处理完成之后,指令指针到此
55 }