zoukankan      html  css  js  c++  java
  • 异常过滤程序 EXCEPTION_EXECUTE_HANDLER, EXCEPTION_CONTINUE_EXECUTION,EXCEPTION_CONTINUE_SEARCH

      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
    ",Sub1(x));
    26 printf("%d
    ",Sub1(NULL));
    27 printf("%s
    ", 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
    ",Sub1(NULL));
     28 //printf("%d
    ",Sub1(NULL));
     29 //printf("%s
    ", 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
    ",Sub1(NULL));
    22 //printf("%d
    ",Sub1(NULL));
    23 //printf("%s
    ", 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('');
    46 }
    47 __except(EXCEPTION_CONTINUE_SEARCH )
    48 {
    49 
    50 printf("EXCEPTION_CONTINUE_SEARCH
    ");//无效的。
    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 }
  • 相关阅读:
    代码中一些常见的小片段
    Surface Pro 3 扩展坞体验
    Microsoft SQL Server 存储过程举例
    Google Guava学习笔记——基础工具类针对Object类的使用
    Google Guava学习笔记——基础工具类Preconditions类的使用
    Google Guava学习笔记——基础工具类String处理类的使用
    Google Guava学习笔记——基础工具类Splitter的使用
    Google Guava学习笔记——基础工具类Joiner的使用
    Google Guava学习笔记——简介
    好书推荐——《Soft Skill》
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14731533.html
Copyright © 2011-2022 走看看