博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异常过滤程序 EXCEPTION_EXECUTE_HANDLER, EXCEPTION_CONTINUE_EXECUTION,EXCEPTION_CONTINUE_SEARCH...
阅读量:5030 次
发布时间:2019-06-12

本文共 4294 字,大约阅读时间需要 14 分钟。

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可以阻止全局展开进行

//以空格作为分割符的符号个数//内存复制功能// test1.cpp : 定义控制台应用程序的入口点。//#include 
#include
#include
#include
#include
int Sub1(const char* v1);CHAR* Sub2(CHAR*Source, size_t Destination); const char* x = "11 11 1 ssssssssssss"; int main(){printf("%d\r\n",Sub1(x));printf("%d\r\n",Sub1(NULL));printf("%s\r\n", Sub2("11 11 1 ssssssssssss",50));return 0;}int Sub1(const char* v1){int length = -1;char* Buffer = NULL;__try{Buffer = (char*)malloc(strlen(v1) + 1);strcpy(Buffer, v1);char* pszToken = strtok(Buffer,"s");//在第一次调用 strtok 时,函数跳过前导分隔符(连在一起算一个)并返回指向在 strToken的第一个标记的指针,以空字符终止标记。 通过一系列 strtok 的调用,多个标记将被从 strToken 的其余部分拆开。 每个 strtok调用通过插入 null 字符在该调用返回 token 之后修改strToken。for (; pszToken != NULL; pszToken = strtok(NULL, "s"))length++;length++;}__except(EXCEPTION_EXECUTE_HANDLER){}free(Buffer);return(length);}CHAR* Sub2(CHAR*Source, size_t size){CHAR* v1 = NULL;__try{v1 = (CHAR*)malloc(size);memcpy(v1, Source, size);}__except(EXCEPTION_EXECUTE_HANDLER){free(v1);v1 = NULL;}return(v1);}

 

EXCEPTION_CONTINUE_EXECUTION (–1) 异常被忽略或已被修复,程序控制留跳转到导致异常的那条指令,并尝试重新执行这条指令,继续恢复运行。需要很谨慎

 

////// test1.cpp : 定义控制台应用程序的入口点。//#include 
#include
#include
#include
#include
TCHAR BufferData[100];int Sub1(const char* v1);CHAR* Sub2(CHAR*Source, size_t Destination);LONG Filter1(TCHAR **v1);void Sub5();const char* x = "11 11 1 ssssssssssss"; int main(){Sub5();// printf("%d\r\n",Sub1(NULL));//printf("%d\r\n",Sub1(NULL));//printf("%s\r\n", Sub2("11 11 1 ssssssssssss",50));return 0;}int Sub1(const char* v1){int length = -1;char* Buffer = NULL;__try{Buffer = (char*)malloc(strlen(v1) + 1);strcpy(Buffer, v1);char* pszToken = strtok(Buffer,"s");//在第一次调用 strtok 时,函数跳过前导分隔符(连在一起算一个)并返回指向在 strToken的第一个标记的指针,以空字符终止标记。 通过一系列 strtok 的调用,多个标记将被从 strToken 的其余部分拆开。 每个 strtok调用通过插入 null 字符在该调用返回 token 之后修改strToken。for (; pszToken != NULL; pszToken = strtok(NULL, "s"))length++;length++;}__except(EXCEPTION_EXECUTE_HANDLER){}free(Buffer);return(length);}CHAR* Sub2(CHAR*Source, size_t size){CHAR* v1 = NULL;__try{v1 = (CHAR*)malloc(size);memcpy(v1, Source, size);}__except(EXCEPTION_EXECUTE_HANDLER){free(v1);v1 = NULL;}return(v1);}void Sub5(){int v1 = 0;TCHAR *pBuffer = NULL;__try{*pBuffer = TEXT('j');//第一次 指针没有初始化 进Filter1()返回EXCEPTION_CONTINUE_EXECUTION 需要很谨慎v1 = 5 / v1;//第二次发生异常 v1初始化为0}__except(Filter1(&pBuffer)){MessageBox(NULL, NULL, NULL, MB_OK);}MessageBox(NULL,TEXT("ssss"), NULL, MB_OK);}LONG Filter1(TCHAR **v1){if (*v1 == NULL){*v1 = BufferData;printf("hello");return(EXCEPTION_CONTINUE_EXECUTION);}return(EXCEPTION_EXECUTE_HANDLER);}

 

EXCEPTION_CONTINUE_SEARCH (0) 异常不被识别,也即当前的这个__except模块不是这个异常错误所对应的正确的异常处理模块。系统将继续到上一层的try-except域中继续查找一个恰当的__except模块。

单纯返回常量EXCEPTION_CONTINUE_SEARCH,系统寻找到在它上一层的一个try块并调用对应的异常过滤程序中的函数。(此时若出现异常终止程序会先忽略)

//以空格作为分割符的符号个数//内存复制功能// test1.cpp : 定义控制台应用程序的入口点。//#include 
#include
#include
#include
#include
TCHAR BufferData[100];void Sub6();void Sub6_BELONG(TCHAR *v1);LONG Filter2(TCHAR **v1);int main(){Sub6();//Sub5();// printf("%d\r\n",Sub1(NULL));//printf("%d\r\n",Sub1(NULL));//printf("%s\r\n", Sub2("11 11 1 ssssssssssss",50));return 0;}void Sub6(){TCHAR *pBuffer = NULL;__try{Sub6_BELONG(pBuffer);}__except(Filter2(&pBuffer)){MessageBox(NULL, NULL, NULL, MB_OK);}}void Sub6_BELONG(TCHAR *v1){__try{*v1 = TEXT('\0');}__except(EXCEPTION_CONTINUE_SEARCH ){printf("EXCEPTION_CONTINUE_SEARCH\r\n");//无效的。}}LONG Filter2(TCHAR **v1){if (*v1 == NULL){*v1 = BufferData;printf("EXCEPTION_CONTINUE_EXECUTION");return(EXCEPTION_CONTINUE_EXECUTION);}return(EXCEPTION_EXECUTE_HANDLER);}

 

转载于:https://www.cnblogs.com/Crisczy/p/7728937.html

你可能感兴趣的文章
从setting文件导包
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
union和union all
查看>>
Github 开源:使用控制器操作 WinForm/WPF 控件( Sheng.Winform.Controls.Controller)
查看>>
PMD使用提醒
查看>>
Codeforces 887D Ratings and Reality Shows
查看>>
论文《A Generative Entity-Mention Model for Linking Entities with Knowledge Base》
查看>>
CentOS 6.7编译安装PHP 5.6
查看>>
Linux记录-salt分析
查看>>
Android Studio默认快捷键
查看>>
发布开源库到JCenter所遇到的一些问题记录
查看>>
第七周作业
查看>>
函数式编程与参数
查看>>
flush caches
查看>>
SSAS使用MDX生成脱机的多维数据集CUB文件
查看>>
ACM_hdu1102最小生成树练习
查看>>
MyBatis源码分析(一)--SqlSessionFactory的生成
查看>>
android中ListView点击和里边按钮或ImageView点击不能同时生效问题解决
查看>>
CTF常用工具之汇总
查看>>
java的面向对象 (2013-09-30-163写的日志迁移
查看>>