【请教高手】为什么set_unexpected和自己的unexpected没有起作用

iamcaicainiao 2006-05-11 08:18:28
源程序:
//Unexpected.cpp
//"Doesn't terminate properly"
#include <exception>
#include <iostream>
using namespace std;

class Up{};
class Fit{};
void g();

void f(int i) throw(Up, Fit){
switch(i){
case 1: throw Up();
case 2: throw Fit();
}
g();
}

void g(){throw 47;}

void my_unexpected(){
cout<<"unexpected exception throw"<<endl;
exit(0);
}

int main(int argc, char* argv[])
{
set_unexpected(my_unexpected);
for(int i=1; i<=3; i++)
try{
f(i);
}catch(Up){
cout<<"Up caught"<<endl;
}catch(Fit){
cout<<"Fit caught"<<endl;
}
return 0;
}
注释:
书上说,如果函数所抛出的异常没有列在异常规格说明的异常集中,unexpected()会被调用。默认的unexpected函数会调用terminate函数。
另外,可以调用函数set_unexpected()来设置自己的函数来响应意外的异常。如本例题。

问题:
i为1时,抛出Up异常,包含在异常规格说明中,被捕获,输出Up caught,可以理解。
i为2时,抛出Fit异常,包含在异常规格说明中,被捕获,书出Fit caught,可以理解。

不能理解的是,i为3时,调用g(),抛出47。不包含在异常规格说明中,此时set_unexpected和自己的my_unexpected不是该起作用吗?
为什么单步执行时发现“throw 47”这个地方就出错了。提示:
“Unhandled exception in Unexpected.exe”。
直接运行,说“Debug error”。
源程序的注释中“//"Doesn't terminate properly"”是否就是表明了这个意思呢,既然这样,我又怎样才能看到效果,验证set_unexpected起作用了呢。
...全文
217 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamcaicainiao 2006-05-11
  • 打赏
  • 举报
回复
木有办法啦。
公司里只有破vc6,还没有msdn。此其一。
回家又不能上网。此其二。
(考虑那天搬家上网或者买盘装你说的DevCPP或MinGW或CodeBlock)
公司不准随便下载东西。尤其是盗版。此其三。
不过不知道你说的这些是否是免费的正版,否则可以冒险下载一下。

to ugg(逸学堂(exuetang.net)) :
其实就1点,我比较菜。嗯。努力了。
iamcaicainiao 2006-05-11
  • 打赏
  • 举报
回复
搞定了。接贴。现在已经知道最简单的用gcc了。
原来就是:
g++ 文件名.cpp。
a.out。
哈哈。
接贴。happy。
xiaocai0001 2006-05-11
  • 打赏
  • 举报
回复
>> 要不你教我怎么用gcc?没用过,不会啊

下一个DevCPP或MinGW或CodeBlock,这些编译器都是用gcc的. 不是在Linux系统下, 没必要学习gcc那么多复杂的编译命令选项的.
逸学堂 2006-05-11
  • 打赏
  • 举报
回复
1:说明老菜的提问技术好;
2:说明老菜还是菜;
3:说明大家对你比较关心;
先总结3点,lx补充
逸学堂 2006-05-11
  • 打赏
  • 举报
回复
MS不支持此功能,所以用GCC
iamcaicainiao 2006-05-11
  • 打赏
  • 举报
回复
为什么每次我问的问题都很容易被大家解决了呢?
看来还是我菜。
逸学堂 2006-05-11
  • 打赏
  • 举报
回复
// compile with: /EHsc ,// 编译器要支持/EHsc
#include<exception>
#include<iostream>

using namespace std;

void unfunction( )
{
cout << "I'll be back." << endl;
terminate( );
}

int main( )
{
unexpected_handler oldHand = set_unexpected( unfunction );
unexpected( );
}

_Pnew must not be a null pointer.

The C++ Standard requires that unexpected is called when a function throws an exception that is not on its throw list. The current implementation does not support this. The following example calls unexpected directly, which then calls the unexpected_handler.

这是MSDN的一个例子

我调试程序时,有一个警告,如下。

忽略 C++ 异常规范,但指示函数不是 __declspec(nothrow)

使用异常规范声明函数,Visual C++ 接受但并不实现此规范。包含在编译期间被忽略的异常规范的代码可能需要重新编译和链接,以便在支持异常规范的未来版本中重用。

iamcaicainiao 2006-05-11
  • 打赏
  • 举报
回复
谢谢
lightnut() ( ) 信誉:100
,解决了为什么。呵呵。我搞定gcc,就回来接贴啊。
iamcaicainiao 2006-05-11
  • 打赏
  • 举报
回复
你果然强人啊,一下子看出来本程序不适合vc来搞啊。我是有那个注释都没看见,当然就更不懂为什么了。佩服。
佩服。
五体投地。
lightnut 2006-05-11
  • 打赏
  • 举报
回复
如果用的是VC++, 永远不会调用un_expected(), MS认为un_expected()与terminate()比没有任何好处, 所以他不遵守C++标准.:)

MSDN的原文:
In the current Microsoft implementation of C++ exception handling, unexpected calls terminate by default and is never called by the exception-handling run-time library. There is no particular advantage to calling unexpected rather than terminate.

iamcaicainiao 2006-05-11
  • 打赏
  • 举报
回复
哦,我看到了。
原注释中还有一句话
//“{-msc}”
意思就是本例题不适合 microsoft visual c++.net 7.0,哈哈。我忽略了。
好的,我来学gcc,搞定了,给你分。
iamcaicainiao 2006-05-11
  • 打赏
  • 举报
回复
是的。就是vc下用的。
要不你教我怎么用gcc?没用过,不会啊。
xiaocai0001 2006-05-11
  • 打赏
  • 举报
回复
不是在VC下试这段程序的吧?

64,700

社区成员

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

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