一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

  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 }

 

posted on 2021-05-05 13:24  一杯清酒邀明月  阅读(492)  评论(0编辑  收藏  举报