目录

  • C++ noexcept:
    • 1、用途
    • 2、用法
      • 1、noexcept声明符的用法:
      • 2、noexcept运算符的用法
  • 异常传播
    • 1、异常传播的定义
    • 2、异常传播中的规则
    • 3、异常传播的代价

C++ noexcept:

1、用途

C++11使用noexcept指明函数是否抛出异常:

若函数不抛异常,则可做编译优化
即便函数抛异常,也不再说明所抛异常类型(简化)

注意,C++03将throw(ExceptionType)放到函数后面,说明函数会抛出什么类型的异常,也被称为“异常规约”
java用 throws关键字做同样的事情

2、用法

1、noexcept声明符的用法:

void foo() noexcept {}       //函数不抛异常void foo() noexcept(true) {} // noexcept(true)等价于noexceptvoid foo() {} // 可能会抛出异常void foo() noexcept(false) {} // noexcept(false)等价于什么也不写,可能会抛出异常

需要注意的地方:
1、noexcept不能用于区分重载函数。

2、如果我们声明函数时说了它不抛异常,但是又在noexcept函数中抛出异常,这就等于调用std::terminate(),终结程序的运行。

void f() { /* 潜在抛出异常 */ }
void g() noexcept {f();      // 合法,即 使 f 抛出 throw 42; // 合法,等效于调用 std::terminate
}


编译时会报警告:

主函数调用foo(),运行时程序会终止:

2、noexcept运算符的用法

bool noexcept( expression )

noexcept 运算符进行编译时检查,若表达式声明为不抛出任何异常则返回 true。
noexcept (may_throw())返回false,表明可能会抛异常。
noexcept (no_throw())返回true,表明不抛异常。

void may_throw();
void no_throw() noexcept;
int main() {std::cout << std::boolalpha<< "Is may_throw() noexcept? "<< noexcept (may_throw()) << '\n'<< "Is no_throw() noexcept? "<< noexcept (no_throw()) << '\n';
}

异常传播

1、异常传播的定义

嵌套的函数调用,每个函数中都有 try-catch 块,内层函数抛出异常,这时候会出现异常传播

如图,func3中出现了异常,如果没有被func2中的catch捕获到的话,异常会随着函数的返回,交给函数的上一级(func1)处理,如果func1也处理不了,则交给main函数处理,如果main函数处理不了,程序会崩溃。
需要注意的地方:

  1. try块中抛出异常的语句后面的语句
  2. catch的异常类型与所需匹配的异常实例的类型

2、异常传播中的规则

try-catch的执行规则

  1.  try块中的异常:抛异常的语句后的块代码都被跳过,并开始找exception handler的代码(即找catch代码)
    
  2.  找exception handler的流程:沿函数调用的链反向寻找(1)    按catch块的顺序对比,找到则执行catch块代码(2)    找不到,退出当前函数,将异常传给调用当前函数的函数
    

仍然以上图调用链为例:

Quiz: function3抛出

  1. Exception3,执行哪些statement?
    执行Process ex3 -> statement6-> statement3-> statement4-> statement1-> statement2;
  2. Exception2,执行哪些statement?
    执行Process ex2 ->statement4-> statement1-> statement2;
  3. Exception1,执行哪些statement?
    执行Process ex1 -> statement2;
  4. Exception0,执行哪些statement?
    返回到主函数,程序崩溃

3、异常传播的代价

C++引入的异常处理会为程序带来额外开销和代价。

(1)项目中使用异常,需要考虑与未使用异常的第三方和旧项目代码的整合问题,避免出现一异常安全问题;
(2)异常使用不当,容易造成内存泄漏和程序崩溃,比如函数内抛出异常需要注意栈展开导致的内存泄露,析构函数抛出异常将程序置于不确定状态等;
(3)异常的跳转会彻底扰乱程序的执行流程并难以判断,给代码调试和维护增加难度;
(4)为保证写出异常安全的代码,往往需要借用C++其它特性,如智能指针,这又进一步加剧了代码可读性的恶化与程序的时空开销,包括编译时间的延长,运行效率的较低以及代码尺寸的增大。

【C++基础】C++11的noexcept声明符 与 异常传播相关推荐

  1. laravel基础课程---11、lavarel的ajax操作(ajax优劣势是什么)

    laravel基础课程---11.lavarel的ajax操作(ajax优劣势是什么) 一.总结 一句话总结: 优势:用户友好度:异步通信,不会频繁刷新页面,用户友好度比较高 优势:减轻数据库压力 缺 ...

  2. c语言如何打印矩形图形的程序 五行七列,C语言程序计 第二讲.printf打印图形.转义字符.格式声明符.doc...

    白匿潮抛辣胖嫡隅费唤激百努弱兢终秃疵褪沉硝脊逆躁剪帕份谍契氟栖概更羊劣租砾纳丸酬革峭泌惊淡橡巩席索庇豫疥屿愿点红星湾叉淤儒途童煤堵挽淘影碾轻霜秩隐憋昆躇笔员肌插驾宠炙彻抛负洞匝谓羚颠荧红魏赦严宛骏按氯 ...

  3. 6.11 通过文件描述符来获取信号

    6.11 通过文件描述符来获取信号 从内核2.6.22版本开始,Linux提供了另外一种机制来接收信号:通过文件描述符来获取信号即signalfd机制. 这个机制和sigwaitinfo非常地类似,都 ...

  4. 山东理工大学计算机期末考试题,山东理工大学计算机基础试题11

    山东理工大学计算机基础试题11 一.单选题(共20分,每小题1分) 1. 计算机存储器可以分为 . A)软盘.硬盘 B)磁盘.磁带.光盘 C)内存.外存 D)RAM.ROM 2. 以下4个数中最大的是 ...

  5. ArcGIS二次开发基础教程(11):网络分析之最短路径分析

    ArcGIS二次开发基础教程(11):网络分析之最短路径分析 最短路径分析 这里直接调用了在mdb中建立好的网络数据集 //全局变量 private INetworkDataset my_networ ...

  6. 拼题A基础篇 11 输出闰年

    拼题A 基础篇11 输出闰年 #include<stdio.h> main() {int year, number = 0;scanf("%d", &year) ...

  7. Python学习笔记11:函数修饰符

    Python学习笔记11:函数修饰符 Python有很多有趣的特性,其中函数修饰符就是一个. 我们在之前的那个web应用示例中用过如下写法: @web.route('/log') @符号后边的,就是一 ...

  8. 11【泛型、Map、异常】

    上一篇:10[List.Set.Queue] 下一篇:12[多线程.锁机制.lock锁] 目录:[JavaSE零基础系列教程目录] 文章目录 11[泛型.双列集合.异常] 一.泛型 1.1 泛型概述 ...

  9. python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...

    从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 ​ 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...

最新文章

  1. gitlab邮箱验证 邮箱提醒设置
  2. c语言中的字节序和字节对齐,C语言字节序对齐以及空间利用率
  3. 多线程的几种实现方法
  4. Spring Security HttpSecurity.authorizeRequests
  5. Cora数据集介绍+python读取
  6. AOS V0.6 发布,JavaEE 应用基础平台
  7. 随着2018世界杯足球赛,有几个产品或APP的知名度大增
  8. Ubuntu 16.04 安装 破解版的PyCharm
  9. coverity静态安全扫描分析软件linux环境搭建
  10. 浅谈CFD(constant fraction discriminator恒比鉴相器)
  11. 浅谈色彩学:以红色为主的色彩配色
  12. SQL注入-waf绕过
  13. Linux PCI驱动框架分析过程
  14. FineBI01:FineBI介绍
  15. JVM垃圾回收(二) 垃圾回收算法
  16. 优秀网页翻译:高精度 10MHz GPS 驯服钟 (GPSDO) - Part3
  17. 机器人控制器编程课程-教案03-进阶
  18. servlet的异步和非阻塞原理
  19. 班章管家稳定放心:五万元应该怎样理财?理财产品怎样选?
  20. Vue+Gojs实现流程图demo

热门文章

  1. java中解密技术是什么_详解Java 加密解密技术的分类和归纳
  2. php制作简单的用户登陆,如何用php代码实现简单的用户登陆以及登陆验证功能
  3. matlab短均线滞后项,均线理论的滞后性问题
  4. abaqus单位_ANSYS和ABAQUS哪个好,一个例子告诉你
  5. OnSen UI结合AngularJs打造”美团APP我的”页面 --Hybrid App
  6. 自从我这样撸代码以后,公司网页的浏览量提高了107%!
  7. 原生类型的autoboxing和auto-unboxing
  8. java.lang.IllegalStateException: Connection pool shut down
  9. 排序算法之(7)——堆排序
  10. windows中当你的键盘无法使用时我们可以用另一种方法哦