E.30: Don't use exception specifications

E.20:不要使用抛异常声明

Reason(原因)

Exception specifications make error handling brittle, impose a run-time cost, and have been removed from the C++ standard.

抛异常声明让错误处理更脆弱,强制产生运行时成本,已经从C++标准中被移除了。

Example(示例)

int use(int arg)throw(X, Y)
{// ...auto x = f(arg);// ...
}

If f() throws an exception different from X and Y the unexpected handler is invoked, which by default terminates. That's OK, but say that we have checked that this cannot happen and f is changed to throw a new exception Z, we now have a crash on our hands unless we change use() (and re-test everything). The snag is that f() may be in a library we do not control and the new exception is not anything that use() can do anything about or is in any way interested in. We can change use() to pass Z through, but now use()'s callers probably needs to be modified. This quickly becomes unmanageable. Alternatively, we can add a try-catch to use() to map Z into an acceptable exception. This too, quickly becomes unmanageable. Note that changes to the set of exceptions often happens at the lowest level of a system (e.g., because of changes to a network library or some middleware), so changes "bubble up" through long call chains. In a large code base, this could mean that nobody could update to a new version of a library until the last user was modified. If use() is part of a library, it may not be possible to update it because a change could affect unknown clients.

如果f()抛出了不同于X和Y的异常,就会激活意外的错误处理,而这个处理的默认动作就是终止程序。那样还好,假设我们已经检查过了,这种事情不会发生,这时如果f被修改为抛出一个新异常Z,系统马上就会发生崩溃,除非我们修改use()(并且重新进行完整测试)。麻烦在于f()可能处于某个我们无法控制的功能库中,而且对于新异常use()也没有什么可做的,或者根本就不感兴趣。我可以修改use()将Z传出,但是接下来user()的调用者可能需要跟着修改。情况很快就会失控。或者我们可以为use()增加try-catch结构将Z映射到一个可以接受的异常。情况很快会再次失控。注意成组修改异常经常发生在系统的底层(例如由于网络库或某个中间件发生变化),因此变更会像气泡一样向上传递至整个调用链。在大规模代码中,这可能意味着没有人可以将库更新到新版本,直到最后的调用者发生变更。如果use()是库的一部分,它可能无法更新,因为这种变更不知道会影响谁。

The policy of letting exceptions propagate until they reach a function that potentially can handle it has proven itself over the years.

让异常传播直至一个有可能处理它的函数,这样的原则已经证明自己很多年了。

Note(注意)

No. This would not be any better had exception specifications been statically enforced. For example, see Stroustrup94.

没有。坚持推进使用抛异常声明一点好处也没有。参见

Stroustrup. The Design and Evolution of C++ (Addison-Wesley, 1994).

Note(注意)

If no exception may be thrown, use noexcept or its equivalent throw().

如果不会抛出任何异常,使用noexcept或者和它等价的throw()

Enforcement(实施建议)

Flag every exception specification.

标记所有的抛出异常声明。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#e30-dont-use-exception-specifications

新书介绍

以下是本人3月份出版的新书,拜托多多关注!

本书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。


觉得本文有帮助?请分享给更多人。

关注微信公众号【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

C++核心准则E.30:不要使用抛异常声明相关推荐

  1. C++核心准则ES.30: 不要使用宏进行程序中的文本操作​

    ES.30: Don't use macros for program text manipulation ES.30: 不要使用宏进行程序中的文本操作 Reason(原因) Macros are a ...

  2. php 语法 条件变量,C ++核心准则:注意条件变量的陷阱

    今天,我写了一篇关于条件变量的恐怖文章.您应该意识到条件变量的这一问题.C ++核心准则CP 42仅声明:"不要无条件等待". 等待!条件变量支持一个非常简单的概念.一个线程准备一 ...

  3. modbus软件开发实战指南_C++核心准则?GSL:指南支持库

    GSL: Guidelines support library GSL:指南支持库 The GSL is a small library of facilities designed to suppo ...

  4. 开源压缩算法brotli_Google的Brotli压缩算法,C ++核心准则以及更多新闻

    开源压缩算法brotli 在本周的开源新闻综述中,我们将介绍Google的Brotli压缩算法,适用于GitHub的Classroom,C ++ Core Guidelines等! 2015年9月20 ...

  5. 线程池内运行的线程抛异常,线程池会怎么办

    线程池中实际运行的是线程池自身的线程,只是在runWorker方法中调用了我们传递进入Runnable对象的run()方法,那么如果run()方法中出现异常了,那么要怎么处理?会不会将我们的线程池停掉 ...

  6. 扩展方法where方法查询不到数据,不会抛异常,也不是返回的null

    如题,"扩展方法where方法查询不到数据,不会抛异常,也不是返回的null",示例代码如下: Product类: public class Product{private str ...

  7. java 向上抛异常_Java 异常的处理方式throws

    在昨天的文章<Java 异常的分类与处理>中我们简单地了解了一下在方法声明的位置上使用throws关键字向上抛出异常,下面深入讲解异常的第一种处理方式throws. 下面深入讲解异常的第一 ...

  8. Java 异常处理(标准抛异常、异常处理、多异常、Finally、多线程异常处理、获取异常的堆栈信息、链试异常、自定义异常)

    使用 catch 处理异常(标准抛异常) public class Main {public static void main (String args[]) {int array[]={20,20, ...

  9. 记一次Task抛异常,调用线程处理而引发的一些随想

    记一次Task抛异常,调用线程处理而引发的一些随想 多线程调用,任务线程抛出异常如何在另一个线程(调用线程)中捕获并进行处理的问题. 1.任务线程在任务线程执行语句上抛出异常. 例如: 1 priva ...

最新文章

  1. SQL Server 日期和时间相关的数据类型有两种
  2. CSS-home.htm
  3. 用神经网络迭代次数曲线模拟原子光谱
  4. apache如何支持asp.net
  5. mysql中的参数如何调试_mysql 查询优化 ~ 查询参数调节
  6. SAP Spartacus B2B User 页面的数据读取逻辑设计
  7. python3.6.8卸载_CentOS7下安装python3.6.8的教程详解
  8. 互联网晚报 | 1月29日 星期六 | 支付宝相互宝正式关停;大钲资本成瑞幸咖啡实控人;苹果创有史以来最高单季营收...
  9. 用管道pipe实现程序与shell/bash脚本之间的通路
  10. 运行Python时中文注释报错的解决办法
  11. PolyCode编译(Linux)
  12. mybatis连接oracle
  13. ZKFinger Live20R 版对接java - B/S(ZKFinger SDK 5.0.0.32 )
  14. Excel单元格科学计数法转换和小数点取整
  15. java 转化箭头函数_this 指向详细解析(箭头函数)
  16. 快递鸟即时查询(PHP)
  17. 黄柳青:中国软件的致命缺陷是什么!
  18. 怎么扫描图片存为电子版?只需要几步小操作
  19. chi2inv函数 matlab_matlab函数列表(A~Z)【转】
  20. 平均路径损耗、小尺度衰落、大尺度衰落的区别

热门文章

  1. 计算机基础及wpsoffice应用一级,一级计算机基础及WPSOffice应用考前练习题及答案...
  2. K8S部署Dashboard和Heapster
  3. 七模二十二频4G通讯模块SLM651B
  4. 想知道PDF转高清图片软件哪个好?
  5. 简单实现Vue中的虚拟dom
  6. mongodb的原子性(Atomicity)和事物 (Transactions)
  7. Transaction: atomicity, consistency, separability, persistence
  8. 2-3-4树对应红黑树的实现,红黑树的融会贯通
  9. Matlab/simulink MW级别双馈风电机组并网仿真模型,kw级别永磁同步机PMSG并网仿真模型
  10. Linux中在zsh下如何安装autojump