这个只有23行的代码为何运行结果不对

forget0915 2018-09-21 09:05:20

#include <stdio.h>
void main()
{
int j, zero;

puts("hello");
__try
{
puts("main()函数的try块中");
zero = 0;
j = 10;
// 下面将导致一个异常
j = 45 / zero;
// 注意,异常出现后,程序控制流又恢复到了这里
//理论上该是这样,为何我在VS环境下测试执行不到这里呢?
printf("这里会执行到吗?值有如何呢?j=%d /n", j);
}
// 注意,这里把zero变量赋值为1,试图恢复错误,
// 当控制流恢复到原来异常点时,避免了异常的再次发生
//理论上该是这样,为何我在VS环境下测试无法恢复错误呢?
__except( (/*puts("in filter"),*/ zero = 1), -1 )
{
puts("main()函数的except块中");
}
puts("world");
}
...全文
127 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2018-09-21
  • 打赏
  • 举报
回复
这是我修改的一个可以得到你想要的结果的例子: 具体的修复方法得根据你的 j = 45 / zero 这条语句编译器为你生成怎样的语句来定, 我的环境下生成的是这样的: 所以我这里是通过修改 ecx 寄存器的值来修复的错误.
yshuise 2018-09-21
  • 打赏
  • 举报
回复
这个错误是系统错误,异常捕捉不了,这与其他语言不同
www_adintr_com 2018-09-21
  • 打赏
  • 举报
回复
你理解有误, EXCEPTION_CONTINUE_EXECUTION 是针对 CPU 层面的, 也就是汇编的级别, 而不是 C++ 的语句级别. 在执行 j = 45 / zero 的时候, 早就把变量读入的寄存器当中的, 产生异常的代码是一条类型 div eax, ecx 的指令. 你修改变量 zero 的值修改的是内存当中的值, 修改完后继续执行的是 div eax, ecx 指令, 而不会执行从 zero 的内存载入数据到 ecx 的指令, 所以是不能修复异常的!
jiht594 2018-09-21
  • 打赏
  • 举报
回复
这么老的代码、还是vc的异常、完全没有看的动力。我连编译都编译不了

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧