C++中throw并非一定要在try块中才有效

cheney1227 2013-12-31 09:00:42
不是说被检测部分必须被放到try块中才起作用么? 下面这段程序

#include<iostream>

using namespace std;



int main()
{
void f1();
try
{f1();}
catch(double)
{cout<<"error1"<<endl;}
cout<<"endmain"<<endl;
return 0;
}

void f1()
{
void f2();
try
{
f2();
}
catch(int)
{
cout<<"error2"<<endl;
}
cout<<"endf1"<<endl;
}

void f2()
{
void f3();
try
{
f3();
}
catch(char)
{
cout<<"error3"<<endl;
}
cout<<"endf2"<<endl;
}

void f3()
{
double a=0,b=1.2;
class SS
{
public:
SS()
{
cout<<"now construct"<<endl;
}
~SS()
{
cout<<"now destruct"<<endl;
}
private:
int aa;
};
SS s;
throw a;
try
{
a=0;

}

catch(float)
{ cout<<"error3"<<endl;
}
cout<<"endf2"<<endl;
}


运行结果是

这说明throw发出的信息还是被catch了啊!有点迷惑
...全文
441 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheney1227 2013-12-31
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
异常传播,会穿透函数,直接传播,函数是不能限制异常传播的。 如果一个函数,调用另一个函数, 被调函数 放在 try块内部调用则catch 块可以捕获,被调函数抛出的异常, 只要被调函数抛出的异常,有对应的catch 块可以接收,并且此前没有被捕获 而对被调函数的调用,是可以到达的。 即:和try块匹配的,任何一个catch块 ,catch 的异常类型和抛出的异常兼容 比如 catch 的异常类型如下 1)被抛出异常类型指针, 2)被抛出类型引用, 2)被抛出类型对象, 4)被抛出异常基类, 即可捕获异常。
谢谢
vipcxj 2013-12-31
  • 打赏
  • 举报
回复
引用 1 楼 taodm 的回复:
你这真是死读书,读死书了。 你那main里面的try块,就不算了?
死读书+1,lz脑子都僵化了 f1调用f2,f2调用f3,f3throw了个double,然后f2和f1都没能接住,但在main里面catch住了
lm_whales 2013-12-31
  • 打赏
  • 举报
回复
异常传播,会穿透函数,直接传播,函数是不能限制异常传播的。 如果一个函数,调用另一个函数, 被调函数 放在 try块内部调用则catch 块可以捕获,被调函数抛出的异常, 只要被调函数抛出的异常,有对应的catch 块可以接收,并且此前没有被捕获 而对被调函数的调用,是可以到达的。 即:和try块匹配的,任何一个catch块 ,catch 的异常类型和抛出的异常兼容 比如 catch 的异常类型如下 1)被抛出异常类型指针, 2)被抛出类型引用, 2)被抛出类型对象, 4)被抛出异常基类, 即可捕获异常。
taodm 2013-12-31
  • 打赏
  • 举报
回复
你这真是死读书,读死书了。 你那main里面的try块,就不算了?

64,662

社区成员

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

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