我好不明白

wearewasingtime 2004-11-29 12:50:52
#include <iostream>
using namespace std;
int a=30 ,b=20;
void ma( int=1,int=2 ) throw (double&); //规定抛出double&异常
void main ()
{try
{ma( a,b);
}

catch (int& d)
{d++;
cout<<"d=" <<d<<"\n";
}
cout << "==========int==============\n";
}

void ma (int a,int b) throw (double&)
{try {cout <<"start\n";
if (a > b)
throw a ;
cout << "close\n";
}
catch (double& d)
{d++;
cout<<"d=" <<d<<"\n";
}
cout << "==========double=============\n";
}

居然能够编译执行成功,我好不明白,望指教!!!!!!!
void ma()规定抛出double&异常,但在实际调用是却抛出了int&异常,书上说系统会调用标准库的unexpected()结束,但vc6好象没看见规定,直接调用了catch (int&)来处理这个异常,我好不明白!!!!!!!!!!!!!!!!!
...全文
184 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wearewasingtime 2004-12-01
  • 打赏
  • 举报
回复
good ,thanks.
SwordMan2001 2004-12-01
  • 打赏
  • 举报
回复
书上说的是没错的。VC6不符合标准的例子多了,这个不必惊奇。如果学习标准C++及标准库,用其它的编译器吧,比如borland c(比如C++ builder),gcc (比如dev C++等).

这个例子在linux下用g++编译运行,结果是
start
abort

结果是正确的.
wearewasingtime 2004-12-01
  • 打赏
  • 举报
回复
zai ding
wearewasingtime 2004-11-30
  • 打赏
  • 举报
回复
ding
wearewasingtime 2004-11-29
  • 打赏
  • 举报
回复
多谢 daidodo(火箭发射机) 的回答,但异常是不支持类型转换的.所以不可能是int -> double.
daidodo 2004-11-29
  • 打赏
  • 举报
回复
抛出的异常类型改变了,int -> double,我想应该是这样。
crashbluebird 2004-11-29
  • 打赏
  • 举报
回复
ding jf
wearewasingtime 2004-11-29
  • 打赏
  • 举报
回复
在实际调用中我故意让ma()抛出了int&异常,ma()处理不了,所以把这个异常转投给了main(),所以运行成功.但我的void ma (int a,int b) throw (double&)不是规定了只能抛出的是double&异常吗?声明和定义中
的throw (double&)就是这个意思,书上说当函数抛出规定以外的异常时系统就会调用标准库的unexpected()来结束,但为什么vc6好象没看见void ma (int a,int b) throw (double&)的规定似的,直接调用了main()的catch (int&)来处理这个异常,而不是调用标准库的unexpected()来结束呢?
gujianhua 2004-11-29
  • 打赏
  • 举报
回复
gz
快乐鹦鹉 2004-11-29
  • 打赏
  • 举报
回复
throw a ;a是整数,当然抛出int&异常了。你将a定义成double型

64,648

社区成员

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

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