C++标准库第二版笔记 3 和异常的理解 1
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的讨论。
关键字 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、不适用于带有危险的(若违反会导致不明确行为)的函数。
C++标准库第二版笔记 3 和异常的理解 1的更多相关文章
- C++标准库第二版笔记 2.1
C++标准库第二版笔记 2.1 1 Range-Based for 循环 for ( decl : coll ) { statements; } // collaborate 类似C# foreach ...
- C++标准库第二版笔记 2
C++标准库第二版笔记 2 微小但重要的语法提升 template表达式内的空格: vector< list<int> >; // OK in each C++ version ...
- C++标准库第二版笔记 1
C++标准库第二版笔记 1 C++ std历史 第一份标准化文档: C++98 & C++03 & TR1 TR1 Information Technology- Programmin ...
- python核心编程第二版笔记
python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d 提供调试输出1.2 –O 生成优化的字节码(生成 ...
- 《C标准库》学习笔记整理
简介 <C标准库>书中对 C 标准库中的 15 个头文件的内容进行了详细的介绍,包括各头文件设计的背景知识.头文件中的内容.头文件中定义的函数和变量的使用.实现.测试等. 我学习此书的目的 ...
- Python高级编程第二版--笔记
不只是CPython Stackless Python Jython(与java集成) IronPython(与net集成) PyPy python真正出众的领域在于围绕语言打造的整个生态系统. Py ...
- 《C++ 标准库》读书笔记 - 第二章 Introduction to C++ and the Standard Library
1. History of the C++ Standards 1.1 History of the C++ Standards C++98 -> C++03 -> TR1 -> C ...
- JavaPersistenceWithHibernate第二版笔记-第四章-Mapping persistent classes-003映射实体时的可选操作(<delimited-identifiers/>、PhysicalNamingStrategy、PhysicalNamingStrategyStandardImpl、、、)
一.自定义映射的表名 1. @Entity @Table(name = "USERS") public class User implements Serializable { / ...
- JavaPersistenceWithHibernate第二版笔记-第四章-Mapping persistent classes-002identity详解
一.简介 1.You now have three methods for distinguishing references: Objects are identical if they occ ...
随机推荐
- mount命令和自动挂载实例
前言 介绍mount命令和一个实例. mount命令 作用 作用:挂载linux系统外的文件 命令格式 mount [-hV] mount -a [-fFnrsvw] [-t vfstype] mou ...
- C++字符串按照指定规则切割的功能模板类,常用的一段检测记录运行时间的代码
template <typename T> struct vector_split { typedef typename std::vector<T>::iterator it ...
- 文本建模、文本分类相关开源项目推荐(Pytorch实现)
Awesome-Repositories-for-Text-Modeling repo paper miracleyoo/DPCNN-TextCNN-Pytorch-Inception Deep Py ...
- Rsync + Lsyncd服务实现文件实时同步/备份
1.接受端安装rsync yum -y install rsync 2.配置同步模块 vim /etc/rsyncd.conf # any name you like [backup] # desti ...
- my题库
数论: 51nod 1240 莫比乌斯函数 51nod 1135 原根 图论: 51nod 1264 线段相交 51nod 1298 圆与三角形 dp: 数位dp: hdu 4734 51nod 10 ...
- java mybatis后台判断表是否存在mysql
<select id="isTableExist" parameterType="string" resultType="int"&g ...
- Double 保留小数点后N位
/** * parse double f to num decimals * @param f * @param num the decimal number * @return the format ...
- tensorflow 升级到1.9-rc0,生成静态图frozen graph.pb本地测试正常, 在其他版本(eg1.4版本)或者android下运行出错NodeDef mentions attr 'dilations' not in Op<name=Conv2D; signature=input:T, filter:T -> output:T; attr=T:type,allowed=[DT_
这时节点定义找不到NodeDef attr 'dilations' not in,说明执行版本的NodeDef不在节点定义上,两个不一致,分别是执行inference的代码和生成静态图节点不一致(当然 ...
- echars踩坑之图表缓存
针对echars 在一个图表内渲染多次数据时,图表会缓存上一次的数据导致下一次的数据图表变形.使用clear()清除图表缓存. 不让页面缓存的方法 按F12打开Network在Disable cach ...
- webpack 4.0配置
webpack一般是本地安装,一般安装webpack webpack-cli,一般是开发依赖上线的时候不需要打包通常npm install webpack webpack-cli -D安装 安装的时 ...