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、不适用于带有危险的(若违反会导致不明确行为)的函数。

C++标准库第二版笔记 3 和异常的理解 1的更多相关文章

  1. C++标准库第二版笔记 2.1

    C++标准库第二版笔记 2.1 1 Range-Based for 循环 for ( decl : coll ) { statements; } // collaborate 类似C# foreach ...

  2. C++标准库第二版笔记 2

    C++标准库第二版笔记 2 微小但重要的语法提升 template表达式内的空格: vector< list<int> >; // OK in each C++ version ...

  3. C++标准库第二版笔记 1

    C++标准库第二版笔记 1 C++ std历史 第一份标准化文档: C++98 & C++03 & TR1 TR1 Information Technology- Programmin ...

  4. python核心编程第二版笔记

    python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d   提供调试输出1.2 –O   生成优化的字节码(生成 ...

  5. 《C标准库》学习笔记整理

    简介 <C标准库>书中对 C 标准库中的 15 个头文件的内容进行了详细的介绍,包括各头文件设计的背景知识.头文件中的内容.头文件中定义的函数和变量的使用.实现.测试等. 我学习此书的目的 ...

  6. Python高级编程第二版--笔记

    不只是CPython Stackless Python Jython(与java集成) IronPython(与net集成) PyPy python真正出众的领域在于围绕语言打造的整个生态系统. Py ...

  7. 《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 ...

  8. JavaPersistenceWithHibernate第二版笔记-第四章-Mapping persistent classes-003映射实体时的可选操作(<delimited-identifiers/>、PhysicalNamingStrategy、PhysicalNamingStrategyStandardImpl、、、)

    一.自定义映射的表名 1. @Entity @Table(name = "USERS") public class User implements Serializable { / ...

  9. JavaPersistenceWithHibernate第二版笔记-第四章-Mapping persistent classes-002identity详解

    一.简介 1.You now have three methods for distinguishing references:  Objects are identical if they occ ...

随机推荐

  1. django原生sql查询如何返回字典格式

    django原生sql查询,默认返回的是元祖.如果想返回字典格式,需要自行封装: http://www.360doc.com/content/17/0802/11/9200790_676042880. ...

  2. 使用spring-session共享springmvc项目的session

    一.说在前面 spring mvc项目,使用nginx,tomcat部署. 之前没做session共享,而nginx采用sticky模块进行分发. 但发现有时不能正确地指向同一台服务器,从而导致ses ...

  3. FLV 格式导入 视频

  4. delphi:Exception EInvalidPointer in module Project1.exe

    在用delphi XE5编程时遇到如下问题: Exception EInvalidPointer in module Project1.exe at 00007595. Invalid pointer ...

  5. Linux 重装系统 连接不上的问题

    https://blog.csdn.net/liqi_q/article/details/78465949 ssh-keygen -R ip

  6. spring @Bean注解的使用

    @Bean 的用法 @Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里.添加的bean的id为方法名 定义bean 下面是@Co ...

  7. 1503.02531-Distilling the Knowledge in a Neural Network.md

    原来交叉熵还有一个tempature,这个tempature有如下的定义: \[ q_i=\frac{e^{z_i/T}}{\sum_j{e^{z_j/T}}} \] 其中T就是tempature,一 ...

  8. setCapture 使用方法

    setCapture 可以捕获到 移动到浏览器外的鼠标事件. 例如拖动过程中,即使鼠标移动到了浏览器外,拖动程序依然可以执行! 作用就是把 把鼠标事件 捕获到 当前文档指定的对象! setCaptur ...

  9. js,jquery备忘录

    1.var s = str.charCodeAt();转ASCII码 2.String.fromCharCode(65);转字母 3.es6 ... (扩展运算符),将一个数组转化成由逗号分割的队列. ...

  10. Idea使用maven搭建SpringMVC框架

    https://www.cnblogs.com/shang-shang/p/7477607.html