EXCEPTION_EXECUTE_HANDLER (1) 异常已经被识别,也即当前的这个异常错误,系统已经找到了并能够确认,这个__except模块就是正确的异常处理模块。控制流将进入到__except模块中,当except代码块运行结束后,系统会认为异常已经处理,于是允许应用程序继续执行。
全局展开 异常产生,系统夺回控制权,搜索与try块匹配的except块。因为F1中的try块匹配的是finally,于是系统调用栈中向上搜索到另一个try块,当异常过滤程序计算结果为EXCEPTION_EXECUTE_HANDLER,系统必须进行全局展开。马上在发生异常出的finally块中开始全局展开。寻找所有未完成的finally块的try块
如果一个异常发生在try、finally块中,且在其上层没有try、except,进程立刻终止。即全局展开不会发送,finally块也不会执行。
在finally中放入return可以阻止全局展开进行
1 //以空格作为分割符的符号个数
2 //内存复制功能
3 // test1.cpp : 定义控制台应用程序的入口点。
4 //
5 #include <Windows.h>
6 #include <tchar.h>
7 #include <winternl.h>
8 #include <Shlwapi.h>
9 #include<iostream>
10
11
12
13 int Sub1(const char* v1);
14 CHAR* Sub2(CHAR*Source, size_t Destination);
15
16
17
18 const char* x = "11 11 1 ssssssssssss";
19
20
21
22
23 int main()
24 {
25 printf("%d\r\n",Sub1(x));
26 printf("%d\r\n",Sub1(NULL));
27 printf("%s\r\n", Sub2("11 11 1 ssssssssssss",50));
28 return 0;
29
30 }
31
32 int Sub1(const char* v1)
33 {
34 int length = -1;
35 char* Buffer = NULL;
36 __try
37 {
38 Buffer = (char*)malloc(strlen(v1) + 1);
39 strcpy(Buffer, v1);
40 char* pszToken = strtok(Buffer,"s");
41 //在第一次调用 strtok 时,函数跳过前导分隔符(连在一起算一个)并返回指向在 strToken的第一个标记的指针,以空字符终止标记。
42 //通过一系列 strtok 的调用,多个标记将被从 strToken 的其余部分拆开。 每个 strtok调用通过插入 null 字符在该调用返回 token 之后修改strToken。
43 for (; pszToken != NULL; pszToken = strtok(NULL, "s"))
44 length++;
45 length++;
46
47 }
48 __except(EXCEPTION_EXECUTE_HANDLER)
49 {
50
51 }
52 free(Buffer);
53 return(length);
54 }
55 CHAR* Sub2(CHAR*Source, size_t size)
56 {
57 CHAR* v1 = NULL;
58 __try
59 {
60 v1 = (CHAR*)malloc(size);
61 memcpy(v1, Source, size);
62
63
64 }
65 __except(EXCEPTION_EXECUTE_HANDLER)
66 {
67 free(v1);
68
69 v1 = NULL;
70 }
71 return(v1);
72 }
EXCEPTION_CONTINUE_EXECUTION (–1) 异常被忽略或已被修复,程序控制留跳转到导致异常的那条指令,并尝试重新执行这条指令,继续恢复运行。需要很谨慎
1 //
2 //
3 // test1.cpp : 定义控制台应用程序的入口点。
4 //
5 #include <Windows.h>
6 #include <tchar.h>
7 #include <winternl.h>
8 #include <Shlwapi.h>
9 #include<iostream>
10
11 TCHAR BufferData[100];
12
13 int Sub1(const char* v1);
14 CHAR* Sub2(CHAR*Source, size_t Destination);
15
16 LONG Filter1(TCHAR **v1);
17
18 void Sub5();
19 const char* x = "11 11 1 ssssssssssss";
20
21
22
23
24 int main()
25 {
26 Sub5();
27 // printf("%d\r\n",Sub1(NULL));
28 //printf("%d\r\n",Sub1(NULL));
29 //printf("%s\r\n", Sub2("11 11 1 ssssssssssss",50));
30 return 0;
31
32 }
33
34 int Sub1(const char* v1)
35 {
36 int length = -1;
37 char* Buffer = NULL;
38 __try
39 {
40 Buffer = (char*)malloc(strlen(v1) + 1);
41 strcpy(Buffer, v1);
42 char* pszToken = strtok(Buffer,"s");//在第一次调用 strtok 时,函数跳过前导分隔符(连在一起算一个)并返回指向在 strToken的第一个标记的指针,以空字符终止标记。 通过一系列 strtok 的调用,多个标记将被从 strToken 的其余部分拆开。 每个 strtok调用通过插入 null 字符在该调用返回 token 之后修改strToken。
43 for (; pszToken != NULL; pszToken = strtok(NULL, "s"))
44 length++;
45 length++;
46
47 }
48 __except(EXCEPTION_EXECUTE_HANDLER)
49 {
50
51 }
52 free(Buffer);
53 return(length);
54 }
55 CHAR* Sub2(CHAR*Source, size_t size)
56 {
57 CHAR* v1 = NULL;
58 __try
59 {
60 v1 = (CHAR*)malloc(size);
61 memcpy(v1, Source, size);
62
63
64 }
65 __except(EXCEPTION_EXECUTE_HANDLER)
66 {
67 free(v1);
68
69 v1 = NULL;
70 }
71 return(v1);
72 }
73
74 void Sub5()
75 {
76 int v1 = 0;
77 TCHAR *pBuffer = NULL;
78 __try
79 {
80 *pBuffer = TEXT('j');//第一次 指针没有初始化 进Filter1()返回EXCEPTION_CONTINUE_EXECUTION 需要很谨慎
81 v1 = 5 / v1;//第二次发生异常 v1初始化为0
82 }
83 __except(Filter1(&pBuffer))
84 {
85
86 MessageBox(NULL, NULL, NULL, MB_OK);
87 }
88 MessageBox(NULL,TEXT("ssss"), NULL, MB_OK);
89 }
90
91 LONG Filter1(TCHAR **v1)
92 {
93 if (*v1 == NULL)
94 {
95 *v1 = BufferData;
96 printf("hello");
97 return(EXCEPTION_CONTINUE_EXECUTION);
98 }
99 return(EXCEPTION_EXECUTE_HANDLER);
100 }
EXCEPTION_CONTINUE_SEARCH (0) 异常不被识别,也即当前的这个__except模块不是这个异常错误所对应的正确的异常处理模块。系统将继续到上一层的try-except域中继续查找一个恰当的__except模块。
单纯返回常量EXCEPTION_CONTINUE_SEARCH,系统寻找到在它上一层的一个try块并调用对应的异常过滤程序中的函数。(此时若出现异常终止程序会先忽略)
1 //以空格作为分割符的符号个数
2 //内存复制功能
3 // test1.cpp : 定义控制台应用程序的入口点。
4 //
5 #include <Windows.h>
6 #include <tchar.h>
7 #include <winternl.h>
8 #include <Shlwapi.h>
9 #include<iostream>
10
11 TCHAR BufferData[100];
12
13
14 void Sub6();
15 void Sub6_BELONG(TCHAR *v1);
16 LONG Filter2(TCHAR **v1);
17 int main()
18 {
19 Sub6();
20 //Sub5();
21 // printf("%d\r\n",Sub1(NULL));
22 //printf("%d\r\n",Sub1(NULL));
23 //printf("%s\r\n", Sub2("11 11 1 ssssssssssss",50));
24 return 0;
25
26 }
27 void Sub6()
28 {
29 TCHAR *pBuffer = NULL;
30 __try
31 {
32 Sub6_BELONG(pBuffer);
33 }
34 __except(Filter2(&pBuffer))
35 {
36
37 MessageBox(NULL, NULL, NULL, MB_OK);
38 }
39 }
40 void Sub6_BELONG(TCHAR *v1)
41 {
42
43 __try
44 {
45 *v1 = TEXT('\0');
46 }
47 __except(EXCEPTION_CONTINUE_SEARCH )
48 {
49
50 printf("EXCEPTION_CONTINUE_SEARCH\r\n");//无效的。
51 }
52
53 }
54 LONG Filter2(TCHAR **v1)
55 {
56 if (*v1 == NULL)
57 {
58 *v1 = BufferData;
59 printf("EXCEPTION_CONTINUE_EXECUTION");
60 return(EXCEPTION_CONTINUE_EXECUTION);
61 }
62 return(EXCEPTION_EXECUTE_HANDLER);
63 }