关于除0异常的不同表现的问题

awl005 2006-02-13 02:14:12
以下是两段除0异常测试代码

#include <iostream>
using namespace std;

int main()
{
int a,b,c;
try
{
cin>>a; //cin语句在try块内
cin>>b;
c=a/b;
}
catch(...)
{
cerr<<"error";
}
return 0;
}

以上代码编译后,debug版本和release版本均可捕获到异常,运行正常


#include <iostream>
using namespace std;

int main()
{
int a,b,c;
cin>>a; //cin语句在try块外
cin>>b;

try
{
c=a/b;
}
catch(...)
{
cerr<<"error";
}
return 0;
}

上面代码编译后 debug版本正常,而release版本则不能捕获到异常,而产生应用程序错误,被操作系统
捕获到错误而终止

以上现象如何解释?
(编译器: vs.net2003,操作系统 win2k)
...全文
219 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
因为VC++的异常处理是非常差的,很多时候一旦出错,程序就直接退出了,连个提示都没有。
zxwl 2006-03-29
  • 打赏
  • 举报
回复
不抛出异常,那么当出现这种0除后,怎么才能掌握程序控制权那?
mark
awl005 2006-02-14
  • 打赏
  • 举报
回复
找到原因了。。。。
首先。算术异常归咎于算术的自然本质(比如除0),这些情况被称为算术异常,会导致不正确或未定义的值,但不会抛出异常。
--------------------------
说了原因了。。。。

但为什么cin在try内,两个半本就都可以捕获到异常呢?
dragonzxh 2006-02-14
  • 打赏
  • 举报
回复
找到原因了。。。。
首先。算术异常归咎于算术的自然本质(比如除0),这些情况被称为算术异常,会导致不正确或未定义的值,但不会抛出异常。
--------------------------
说了原因了。。。。
awl005 2006-02-14
  • 打赏
  • 举报
回复
找到原因了。。。。
首先。算术异常归咎于算术的自然本质(比如除0),这些情况被称为算术异常,会导致不正确或未定义的值,但不会抛出异常。

再者,c在以下程序中并未用到,$M直接优化掉了。
如果在try中cout<<c<<endl;则一定会报异常的。
具体见汇编代码,不例举~




int a,b,c;
cin>>a; //cin语句在try块外
cin>>b;

try
{
c=a/b;
cout<<c<<endl; //有这句也不行,b=0时debug版本捕获到异常,relase版本产生应用程序错误
}
catch(...)
{
cerr<<"error";
}

不行,只要cin在try外面就不行,release版本不能捕获到异常
dragonzxh 2006-02-13
  • 打赏
  • 举报
回复
找到原因了。。。。
首先。算术异常归咎于算术的自然本质(比如除0),这些情况被称为算术异常,会导致不正确或未定义的值,但不会抛出异常。

再者,c在以下程序中并未用到,$M直接优化掉了。
如果在try中cout<<c<<endl;则一定会报异常的。
具体见汇编代码,不例举~
大熊猫侯佩 2006-02-13
  • 打赏
  • 举报
回复
建议看反汇编后的代码
dragonzxh 2006-02-13
  • 打赏
  • 举报
回复
那是因为你捕获了错误,但是没有处理:
------------------------------
此例根本没有catch到exception.the programe has exited with code 0 (0x0).
iawenll 2006-02-13
  • 打赏
  • 举报
回复
那是因为你捕获了错误,但是没有处理:
应该在捕获错误之后进行处理:
try{
c=a/b;
}
catch(...){
cerr<<"error";
return -1;//增加的处理代码,可以改成你自己的处理方式!
}
return 0;
dragonzxh 2006-02-13
  • 打赏
  • 举报
回复
猜测。#define DEBUG的时候throw了一个exception,没有#ifndef DEBUG的时候,弹出了一个对话框。猜测,猜测。
佐证:
int a,b,c;
cin>>a; //cinÓï¾äÔÚtry¿éÍâ
cin>>b;

try
{
c=a/b;
cout<<"123123"<<endl;//如果前面有throw一个exception的话,不会执行这行

}
catch(...)
{
cerr<<"error";

}

结果
123123
sankt 2006-02-13
  • 打赏
  • 举报
回复
不解
关注。。。
healer_kx 2006-02-13
  • 打赏
  • 举报
回复
可能是优化的问题?

64,282

社区成员

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

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