mdzjx 发表于 2010-10-14 11:37:11

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

我从网上查到资料如下:
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....

rlogin 发表于 2010-10-14 12:40:19

抛出异常后,返回值是没有意义的。

rlogin 发表于 2010-10-14 12:43:32

函数后面的throw没有任何意义,只是给函数调用者看的。你不按规律来也不会有任何警告

whyjld 发表于 2010-10-14 12:49:33

这样的
throw只是一个说明,不是强制性的。
相当于你告诉编译器,这个函数我只准备抛出指定的异常。
但是你强制抛其他类型异常编译器拿你也没有办法,但是应当发出warning,告诉你抛出的和说明的不一致。
这个有点类似强制类型转换。如果你不写,编译器不会自动替你转换,如果你写了,就是告诉编译器你确实希望进行转换。
c编译器相当于你的奴隶,只要你写,就照你写的做,哪怕你写的各部分之间互相矛盾
页: [1]
查看完整版本: 函数后面的throw关键字表示什么意思?