1. catch 子句 (catch clause) 中的异常声明(exception declaration)

声明的类型决定了处理代码所能捕获的异常类型。

这个类型必须是完全类型, 它可以是左值引用, 但不能是右值引用

1.1 catch 的参数类型可以是引用类型或非引用类型

如果 catch 的参数是基类类型, 则我们可以使用其派生类类型的异常对象对其进行初始化。 此时, 如果 catch 的参数是非引用类型, 则异常对象将被切掉一部分

异常声明的静态类型将决定 catch 语句所能执行的操作。如果 catch 的参数是基类类型, 则 catch 无法使用派生类特有的任何成员。

1.2 查找匹配的处理代码

在搜寻 catch 语句的过程中, 我们最终找到的 catch 未必是异常的最佳匹配。 相反,挑选出来的应该是第一个与异常匹配的 catch 语句。 因此, 越是专门的 catch 越应该置于整个 catch 列表的前端

绝大多数类型转换都不被允许, 除了一些极细小的差别之外:

  • 允许从非常量向常量的类型转换, 也就是说, 一条非常量对象的 throw 语句可以匹配一个接受常量引用的 catch 语句。
  • 允许从派生类向基类的类型转换。
  • 数组被转换成指向数组( 元素) 类型的指针, 函数被转换成指向该函数类型的指针

1.3 重新抛出

一条 catch 语句通过重新抛出 (rethrowing) 的操作将异常传递给另外一个 catch 语句。 这里的重新抛出
仍然是一条 throw 语句, 只不过不包含任何表达式:
throw;

{// 使用引用类型的异常声明catch (my_error &eObj) {eObj.status = errCodes::severeErr;     //修改异常对象throw;//重新抛出} catch (other_error_eObj) {// 非引用类型eObj.status = errCodes::badErr;//只是修改了对象的局部副本throw;//异常对象的status没有修改}
}

1.4 .捕获所有异常 (catch-all)

使用省略号作为异常声明,如 catch (… )

catch(…);一条语句可以和任意类型的异常对象匹配。

它经常和重新抛出语句一起使用,其中catch执行完当前局部能够完成的工作之后,重新抛出异常。

{void manip () {try {// 这里的操作将引发并抛出一个异常} catch (...) {// 处理异常的某一些操作throw;}}// catch(...)既可以单独出现// 也可以和其他的catch一起出现// 如果和其他的catch一起出现// 则它必须放在最后的位置// 否则放在捕获所有异常的catch语句之后的catch语句永远不会被执行
}

C++ Primer 5th笔记(chap 18 大型程序工具)捕获异常相关推荐

  1. C++ Primer 5th笔记(chap 18 大型程序工具)使用命名空间成员

    1. 3种方法 using 声明 命名空间的别名( namespace alias) using 指示( using directive) 1.1 命名空间的别名 namespace cplusplu ...

  2. C++ Primer 5th笔记(chap 18 大型程序工具) 多重继承之构造函数、析构函数

    1. 继承的构造函数与多重继承 如果从多个基类中继承了相同的构造函数(即形参列表完全相同),则程序将产生错误 struct Basel {Basel () = default;Basel (const ...

  3. C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间

    1. using 声明或 using 指示能将某些函数添加到候选函数集 2. 对于接受类类型实参的函数来说, 其名字查找将在实参类所属的命名空间中进行.在这些命名空间中所有与被调用函数同名的函数都将被 ...

  4. C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域

    1. 命名空间内部名字的查找规则 由内向外依次查找每个外层作用域. 外层作用域也可能是一个或多个嵌套的命名空间, 直到最外层的全局命名空间查找过程终止. 只有位于开放的块中且在使用点之前声明的名字才被 ...

  5. C++ Primer 5th笔记(chap 18 大型程序工具)未命名的命名空间unnamed namespace

    1. 定义 关键字 namespace 后紧跟花括号括起来的一系列声明语句 1.1 生命周期 未命名的命名空间中定义的变量拥有静态生命周期: 它们在第一次使用前创建, 并且直到程序结束才销毁 未命名的 ...

  6. C++ Primer 5th笔记(chap 18 大型程序工具)内联命名空间 (inline namespace)

    1. inline必须出现在命名空间第一次出现的地方 inline namespace FifthEd {//... }//后续再打开命名空间的时候可以写inline也可以不写 namespace F ...

  7. C++ Primer 5th笔记(chap 18 大型程序工具)命名空间

    1. 问题:命名空间污染 namespace pollution 多个库将名字放置在全局命名空间 1.1 一般人的解决方法 起长名字 eg. class cplusplus_primer_Query ...

  8. C++ Primer 5th笔记(chap 18 大型程序工具)noexcept

    1. 通过提供 noexcept 说明 ( noexcept specification ) 指定某个函数不会抛出异常. 其形式是关键字 noexcept 紧跟在函数的参数列表后面 {// 紧跟在函数 ...

  9. C++ Primer 5th笔记(chap 18 大型程序工具)异常处理

    1. 异常处理 ( exception handling) 允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理. 异常使得我们能够将问题的检测与解决过程分离开来. 程序的一部分负 ...

  10. C++ Primer 5th笔记(chap 18 大型程序工具)构造函数与虚继承

    1. 继承体系中的每个类都可能在某个时刻成为" 最低层的派生类". 只要我们能创建虚基类的派生类对象, 该派生类的构造函数就必须初始化它的虚基类. Bear::Bear (std: ...

最新文章

  1. The Shortest Statement CodeForces - 1051F LCA+最短路
  2. 解决sybase数据库的死锁问题
  3. 牙齿间隙变大怎么办_牙齿矫正会让牙缝变大吗?
  4. spring mvc传值html页面,spring mvc向前台页面传值-ModelAndView
  5. get和post的联系与区别
  6. vscode 不展示文档注释内容_文本框这样用,实现文档不同板块内容高效联动,你还不知道吧...
  7. OpenShift 4 之一些实用命令和技巧
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的社区养老服务网站
  9. MyEclipse10 中的两种FreeMarker插件的安装与配置
  10. VS2010编译器经常遇到的小问题
  11. 产品总监基本功:从零到壹
  12. Java从入门到精通(一)
  13. 基于wke封装的duilib的webkit浏览器控件,可以c++与js互交,源码及demo下载地址
  14. c语言细胞自动机,关于细胞自动机的程序..求救!!谢谢!
  15. python 多目标跟踪_多目标追踪器:用 OpenCV 实现多目标追踪(C++/Python)
  16. 猿创征文|【算法入门必刷】数据结构-栈(二)
  17. 微积分精简版复习提纲
  18. Spire.XLS使用教程:在Java中将 Excel 转换为 CSV或将CSV转换为Excel
  19. 贪心算法(4.加工生产调度(做题思路分析))
  20. Efficient Fully Homomorphic Encryption from (Standard) LWE 论文理解

热门文章

  1. JVM:JVM内存划分、主内存、工作内存
  2. Python 海龟画图(turtle)常用的颜色单词
  3. Linux通常把设备对象抽象为,linux 设备模型(1)
  4. ftp上传当天文件的方法_五种方法将文件上传到FTP服务器
  5. 小米机器人虚拟墙设置_扫地机器人虚拟墙应该怎么放置使用
  6. android的文件操作,Android文件操作概要1.ppt
  7. BC:带你温习并解读《中国区块链技术和应用发展白皮书》—概述
  8. TF之CNN:基于CIFAR-10数据集训练、检测CNN(2+2)模型(TensorBoard可视化)
  9. Py之imgaug:Python库之imgaug简介、安装、使用方法之详细攻略
  10. Python + wordcloud + jieba 十分钟学会生成中文词云