c++ primer plus 第15章友,异常和其他:异常,15.3.5 异常规范和 C++11

c++ primer plus 第15章友,异常和其他:异常,15.3.5 异常规范和 C++11

15.3.5 异常规范和 C++11


15.3.5 异常规范和 C++11

有时候,一种理念看似有前途,但实际的使用效果并不好。一个这样的例子是异常规范(exceptionspecification),这是 C++98 新增的一项功能,但 C++11却将其摒弃了。这意味着 C++11仍然处于标准之中,但以后可能会从标准中剔除,因此不建议您使用它。
然而,忽视异常规范前,您至少应该知道它是什么样的,如下所示:

double harm(double a)throw(bad thing); // may throw bad thing exception
double marm(double)throw();/doesn't throw an exception

其中的 throw()部分就是异常规范,它可能出现在函数原型和函数定义中,可包含类型列表,也可不包含异常规范的作用之一是,告诉用户可能需要使用try块。然而,这项工作也可使用注释轻松地完成。异常规范的另一个作用是,让编译器添加执行运行阶段检查的代码,检查是否违反了异常规范。这很难检查。例如,marm()可能不会引发异常,但它可能调用一个函数,而这个函数调用的另一个函数引发了异常。另外,您给函数编写代码时它不会引发异常,但库更新后它却会引发异常。总之,编程社区(其是尽力编写安全代码的开发人员)达成的一致意见是,最好不要使用这项功能。而 C++11也建议您忽略异常规范。然而,C++11确实支持一种特殊的异常规范:您可使用新增的关键字noexcept 指出函数不会引发异常:

double marm()noexcept;//marm()doesn't throw an exception

有关这种异常规范是否必要和有用存在一些争议,有些人认为最好不要使用它(至少在大多数情况下如此);而有些人认为引入这个新关键字很有必要,理由是知道函数不会引发异常有助于编译器优化代码。通过使用这个关键字,编写函数的程序员相当于做出了承诺。
还有运算符noexcept(),它判断其操作数是否会引发异常,详情请参阅附录E。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值