C++标准库第二版笔记 3 和异常的理解 1


差错和异常(error and exception)的处理

标准异常类(exception class)

定义于

分为: 1、语言本身支持的异常 2、标准库发出的异常 3、程序作用域(scope of a program)之外发出的异常

程序作用域内的错误通常可以被避免(代码的逻辑错误,俗称bug)。程序外的错误,例如资源不足等列为第三种。

栈解旋(stack unwinding)

异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上的构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反。这一过程称为栈的解旋(unwinding)。

自注:这也是effective c++中提到的,延后局部变量声明的原因。

异常接口声明(exception interface)

1)为了加强程序的可读性,可以在函数声明中列出可能抛出的所有异常类型,例如:

void func() throw (A, B, C , D); //这个函数func()

能够且只能抛出类型A B C D及其子类型的异常。 2)如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常,例如:

void func();

3)一个不抛掷任何类型异常的函数可以声明为:

void func() throw();

4) 如果一个函数抛出了它的异常接口声明所不允许抛出的异常,unexpected函数会被调用,该函数默认行为调用terminate函数中止程序。

自注:由此引发了之前所没有解决的关键字noexcept的讨论。

引用自csdn文章

关键字 noexcept

void foo() noexcept; // 表面函数foo不准备也不打算抛出异常

字面意思

不打算抛出异常有两层意思。

1、该函数中任意原子操作都绝不抛出异常。
2、所有的异常都会在该函数中得到捕获并妥善解决。

如果在noexcept关键字下的函数中有异常或还尚未处理,程序将调用std terminate并且将默认调用std abort。

原因

他瞄准了空异常明细(empty exception specification)的各种问题。

有三,运行时检验(会直接abort)、开销和无法用于泛型码中

(runtime checking)
(runtime overhead)
(unusable in generic code)

指定何时不抛出异常

void swap(type& x, type& y) noexcept(noexcept(x.swap(y))) {
x.swap(y);
}

因此noexcept等价于noexcept(true)

设计珠玑

1、析构函数应当提供一个隐式供应的(nonthrowing)异常明细。 2、可被标注来说明与c兼容。 3、不适用于带有危险的(若违反会导致不明确行为)的函数。

最新文章

  1. 修改apache上传文件大小限制
  2. MySQL 存储过程 定时任务
  3. [转]把动态页面.aspx 生成静态页面.html
  4. 站点发布到 IIS 后,System.Data.SqlLite.dll 末找到
  5. 《RHEL6硬盘的分区和swap分区管理》——硬盘分区的大总结
  6. localtime()方法的疑惑
  7. Sqlserver 理解子查询
  8. 【POJ 3279 Fliptile】开关问题,模拟
  9. mongoDb c driver
  10. python 序列化及其相关模块(json,pickle,shelve,xml)详解
  11. [leetcode]66. Plus One加一
  12. Jarvis OJ A Piece Of Cake
  13. cu命令
  14. EXT3.3.1在IE9 IE10click事件 失效怎么解决
  15. ID3和C4.5分类决策树算法 - 数据挖掘算法(7)
  16. [转]Global exception handling in Web API 2.1 and NLog
  17. Daily Scrum (2015/10/25)
  18. [Node.js]Domain模块
  19. 数学图形之Breather surface
  20. 全局安装 vue

热门文章

  1. thinkphp5.1明明密码的一致的 却说不一致的解决办法
  2. js:苹果手机页面返回,数据不刷新问题
  3. 手眼标定之相机随动eye-in-hand 示例:handeye_movingcam_calibration
  4. jQuery-UI的使用
  5. 关于微博api中发布话题的api问题
  6. kettle使用笔记1--基本安装和使用
  7. Java框架spring 学习笔记(五):Bean定义继承
  8. 【题解二连发】Construct Binary Tree from Inorder and Postorder Traversal & Construct Binary Tree from Preorder and Inorder Traversal
  9. 浅析MVC模式与三层架构的区别
  10. SpringMVC中注解@RequestBody和@ResponseBody的使用区别