搜索
bottom↓
回复: 3

函数后面的throw关键字表示什么意思?

[复制链接]

出0入0汤圆

发表于 2010-10-14 11:37:11 | 显示全部楼层 |阅读模式
我从网上查到资料如下:
C++函数后面后加到关键字throw(something)限制,是对这个函数的异常安全性作出限制。
void f() throw() 表示f不允许抛出任何异常,即f是异常安全的。
void f() throw(...) 表示f可以抛出任何形式的异常。
void f() throw(exceptionType); 表示f只能抛出exceptionType类型的异常。

来一段测试代码:
#include <iostream>
using namespace std;

void Test() throw()
{
        cout<<"抛出一个异常,测试!"<<endl;
        throw 5;
}

void main()
{
        try
        {
                Test();
        }
        catch(int value)
        {
                cout<<"接收到异常value="<<value<<endl;
        }
}


接下来我要一一验证上面所说的到底是对还是错?(但愿验证方法没错):
其它地方如上代码均不动,我们只改动void Test() throw()这一句来进行试验:



1. void f() throw() 表示f不允许抛出任何异常,即f是异常安全的
//-------------------------------------------------------------------
void Test() throw()
运行结果:
抛出一个异常,测试!
接收到异常value=5
//-------------------------------------------------------------------
函数Test()被标记为throw(),怎么还能够抛出异常呢?


2. void f() throw(...) 表示f可以抛出任何形式的异常
//-------------------------------------------------------------------
void Test() throw(...)
函数编译有误
//-------------------------------------------------------------------
编译错误,原因应该是不能识别"...",哎,为什么?为什么?


3. void f() throw(exceptionType); 表示f只能抛出exceptionType类型的异常。
//-------------------------------------------------------------------
void Test() throw(int)
运行结果:
抛出一个异常,测试!
接收到异常value=5
//-------------------------------------------------------------------
只有这个正常

救命啊:
为什么只有第3种情况行,1、2种情况出了问题?
当然您可以参考MSDN:
http://msdn.microsoft.com/en-us/library/6dekhbbc(VS.80).aspx
这上面我觉得和网上的说的是一样的...
请大家帮忙看看.....
thank you , thank you....

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-10-14 12:40:19 | 显示全部楼层
抛出异常后,返回值是没有意义的。

出0入0汤圆

发表于 2010-10-14 12:43:32 | 显示全部楼层
函数后面的throw没有任何意义,只是给函数调用者看的。你不按规律来也不会有任何警告

出0入0汤圆

发表于 2010-10-14 12:49:33 | 显示全部楼层
这样的
throw只是一个说明,不是强制性的。
相当于你告诉编译器,这个函数我只准备抛出指定的异常。
但是你强制抛其他类型异常编译器拿你也没有办法,但是应当发出warning,告诉你抛出的和说明的不一致。
这个有点类似强制类型转换。如果你不写,编译器不会自动替你转换,如果你写了,就是告诉编译器你确实希望进行转换。
c编译器相当于你的奴隶,只要你写,就照你写的做,哪怕你写的各部分之间互相矛盾
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-16 10:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表