当前位置: 首页 > news >正文

C++ 异常捕获 try 和 __try的区别笔记

最近碰到了try 和 __try的区别的问题,经过实测与验证,发现在vs2019下,确实存在try无法捕获特定异常的问题,比如下面的代码:

//以空格作为分割符的符号个数
//内存复制功能
// test1.cpp : 定义控制台应用程序的入口点。
//
#include <Windows.h>
#include <tchar.h>
#include <winternl.h>
#include <Shlwapi.h>
#include <iostream>int Sub1(const char* v1);
CHAR* Sub2(const CHAR* Source, size_t size);const char* x = "11 11 1 ssssssssssss";int MemStandardTry()
{//仍然使用C++标准的try{}catch(…){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。//注意 / EHa的大小写try{BYTE* pch;pch = (BYTE*)00001234;   //给予一个非法地址 *pch = 6; //对非法地址赋值,会造成Access Violation 异常 }catch (...){std::cout << "catched MemStandardTry" << std::endl;}return 0;
}int MemWinTry()
{__try{BYTE* pch;pch = (BYTE*)00001234;   //给予一个非法地址 *pch = 6; //对非法地址赋值,会造成Access Violation 异常 }__except (EXCEPTION_EXECUTE_HANDLER){std::cout << "catched" << std::endl;}return 0;
}int main()
{MemStandardTry();MemWinTry();
// 	printf("%d\r\n", Sub1(x));
// 	printf("%d\r\n", Sub1(NULL));
// 	char* szChar = (char*)"11 11 1 ssssssssssss";
// 	printf("%s\r\n", Sub2(szChar, 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(const 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);
}

在不做任何设置的情况下 MemStandardTry()在debug模式下可以捕获异常 但是release无法捕获,而MemWinTry()可以正常捕获异常。

但是实际情况是,当我们按照注释,设置 ,则发现try也可以在release模式下捕获该异常。

//仍然使用C++标准的try{}catch(…){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。
//注意 / EHa的大小写

具体设置位置如下:

经过设置后,可以测试正确捕获异常。

进一步的内容,可以参考C++ 异常捕获 try 和 __try的区别_异常捕获的方法与其区别-CSDN博客,谨此纪念。

相关文章:

  • Python环境搭建指南
  • 慈缘基金会“蝴蝶飞”助西藏女孩白玛卓嘎“折翼重生”
  • 基于STM32的居家环境监测报警Proteus仿真+程序设计+设计报告+讲解视频
  • smbd:快速拉取服務端SMB共享文件脚本工具
  • SAM详解3.2(关于2和3的题)
  • 黑马k8s(二)
  • 子串简写(JAVA)一维前缀和, 蓝桥杯
  • 学习黑客5 分钟深入浅出理解cron [特殊字符]
  • 基于阿伦尼斯模型的电池寿命预测:原理、应用与挑战
  • 【智能指针】
  • SD06_前后端分离项目部署流程(采用Nginx)
  • SAP Commerce(Hybris)开发实战(一)
  • linux-----------Ext系列⽂件系统(上)
  • 进阶 DFS 学习笔记
  • 链表头插法的优化补充、尾插法完结!
  • DNS负载均衡和CDN的区别
  • CentOS 7 修改锁屏时间为永不
  • ADI ADRV902x的射频模拟信号输入输出端口的巴伦匹配
  • 暗物质卯引力挂载技术
  • [模型选择与调优]机器学习-part4
  • 雷军:过去一个多月是创办小米以来最艰难的时间
  • 交涉之政、交涉之学与交涉文献——《近代中外交涉史料丛书》第二辑“总序”
  • 明明睡够了,怎么还有黑眼圈?可能是身体在求救
  • 外交部:印巴都表示不希望局势升级,望双方都能保持冷静克制
  • 央行行长详解降息:将通过利率自律机制引导商业银行相应下调存款利率
  • 潘功胜:央行将设立5000亿元服务消费与养老再贷款