1、异常
详细见《c++异常分类》
基类exception有一个virtual函数what,返回错误信息(构造函数设定的)。
基类exception的派生类有runtime_error(运行时错误,运行后检测)、logic_error(逻辑错误,运行前检测)和运算符抛出的异常。
运算符抛出的异常包括:bad_alloc(new抛出),bad_cast(dynamic_cast抛出),bad_typeid(typeid抛出),bad_exception
注意:
(1)如果一个函数抛出列表中包含bad_exception,那么如果一个意料之外的异常发生时,函数unexcpected将抛出bad_exception而不是结束程序,或调用set_unexpected指出的函数。
(2)自定义异常可以不继承exception,所以catch(exception)不能保证捕获所有异常
(3)catch(...)可以捕获所有异常,但是由于没有参数所以没法查找该异常。
2、throw
除了抛出异常,也可以抛出表达式值或int值,如throw x > 5 或 throw 5
重新抛出异常如下:
catch(xxxx){
throw;
}
注意:在catch语句外有throw;语句会调用terminate函数,会导致程序结束。
注意:带有常见错误的函数应返回0或者NULL,而不是抛出异常。通过检查返回值确定调用是否成功。
3、异常说明
列举一系列函数可以抛出的异常,如:
void do(..) throw (ExceptionA, ExceptionB, ...){...}
注意:(1)抛出一个异常说明不允许的异常,会调用unexpected函数。
         (2)没有提供异常说明的函数可以抛出任何异常。在函数设置一个空异常说明throw()表示该函数没有抛出任何异常,如果试图抛出异常,调用unexpected函数。
4、处理意料之外异常
unexpected函数会调用函数set_unexpected注册的函数,如果没有注册会默认调用terminate函数;
terminate函数会调用set_terminate注册的函数,如果没有默认调用abort函数。
调用terminate函数的四种情况:
(1)对抛出的异常,异常机制找不到匹配的catch块
(2)析构函数试图在堆栈展开时抛出一个异常
(3)在没有异常要处理是试图重新抛出异常(即第二条中的注意事项)
(4)调用函数unexpected将默认调用函数terminate
注意:set_unexpected和set_terminate会分别返回一个指向函数unexpected和terminate最后一次调用的函数的指针,如果第一次调用则返回0
注意:set_unexpected和set_terminate接收void返回值且没有参数的函数指针作为参数。
注意:如果自定的终止函数的最后行为并不是退出程序,那么这个函数执行完后会调abort终止程序。
5、堆栈展开
当一个异常被抛出但没有在一个特定的域内被捕获时,该函数调用堆栈就会展开,并试图在下一个外部try..catch内捕获。
展开 函数调用的堆栈,此函数中所有局部变量被销毁。
6、构造、析构函数和异常
构造函数可以抛出异常,异常抛出前会调用析构函数。
如果由于堆栈展开而调用析构函数抛出了一个异常,terminate函数被调用(terminate函数调用四个情况之一)。
7、处理new失败
编译器不同,处理方式不同,有三种:默认返回0;抛出异常(已包含头文件<new>);默认抛出bad_alloc
set_new_handler可以注册一个new失败后的异常处理器。参数是一个没有参数且返回值为空的函数的指针。
注意:一旦注册在set_new_handler注册了,那么new失败时不会抛出bad_alloc,将错误堆栈推给new处理器来处理。
c++标准明确指出new处理器要完成以下任务的一个:
(1)释放其他动态分配内存,并返回运算符new来尝试再次分配内存
(2)抛出bad_alloc型异常
(3)调用函数abort或exit来结束程序
8、auto_ptr和动态分配内存
如果一个异常发生在成功分配内存后,delete语句前,那么发生内存泄漏。auto_ptr可以处理这种情况。
一个auto_ptr对象维护了指向动态分配内存的指针,当一个auto_ptr对象析构函数被调用,它将对其指针的数据成员执行delete。
由于auto_ptr类模板提供了重载运算符"*"和"->",auto_ptr对象可以作为一般指针变量使用。如:
auto_ptr<A> ptr(new A(...));
ptr->do(...)     //do函数是A类的成员函数
注意: (1)auto_ptr不能指向数组和标准容器类。
          (2)auto_ptr能通过它的重载赋值运算符和拷贝构造函数来传递动态内存所有权
9、setjump和longjump
能够指定从一个深度嵌套调用中立即跳转到一个错误处理器(不必层层抛出)。但很危险,因为没有调用为自动对象建立的析构函数。

c++学习笔记之异常相关推荐

  1. HALCON 20.11:深度学习笔记(9)---异常检测

    HALCON 20.11:深度学习笔记(9)---异常检测 HALCON 20.11.0.0中,实现了深度学习方法. 本章解释了如何使用基于深度学习的异常检测. 通过异常检测,我们想要检测图像是否包含 ...

  2. Python学习笔记Task07(异常)

    Python学习笔记Task07(异常) 2.try-except语句 try 语句按照如下方式工作:l 首先,执行try子句(在关键字try和关键字except之间的语句l 如果没有异常发生,忽略e ...

  3. 【原】Java学习笔记030 - 异常

    1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 /* ...

  4. linux硬件控制流,Linux系统学习笔记:异常控制流

    程序计数器中指令的地址的过渡称为控制转移,控制转移的序列称为处理器的控制流.最简单的是平滑流.跳转.调用和返回等指令会造成平滑流的突变,来对内部的程序状态中的变化做出反应.系统也需要能够对系统状态的变 ...

  5. java string逆序_Java学习笔记(八)——异常

    本节主要内容是对 Java 的异常处理进行讲解,主要包含以下知识点: 异常分类 声明及抛出 捕获异常 自定义异常 * 异常堆栈 异常概述 对于程序的错误以及外部环境能够对用户造成的影响,我们应当及时报 ...

  6. java学习笔记(七)----异常

    异常 class Test { public int devide(int x,int y) throws Exception //throws EXception 抛出异常,如果感觉到这个程序可能出 ...

  7. python中用来回溯异常的模块_python学习笔记(异常)

    什么是异常 python用异常对象(exception object)来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的 回溯(Traceback, 一种错误信息) ...

  8. Python学习笔记之异常

    Python用异常对象来表示异常情况,如果异常对象未被处理或捕捉,程序就会回溯(traceback)中止执行. 异常可以在出错时自动引发,也可以主动引发. 异常被引发后如果不被处理就会传播至程序调用的 ...

  9. 简明Python教程学习笔记_8_异常

    菜鸟教程 之 Python 异常处理:http://www.runoob.com/python/python-exceptions.html Python 一篇搞定所有的异常处理:https://ww ...

最新文章

  1. java利用opencv降维_opencv中PCA降维
  2. CORS with Spring MVC--转
  3. 光感是什么_Olay5款热门精华:淡斑小白瓶VS光感小白瓶如何选?超A瓶不太A
  4. 从运营角度看待UE设计
  5. WDK中出现的特殊代码
  6. Spring Cloud Config采用数据库存储配置内容【Edgware+】
  7. 主题目录检索是什么举例子_网络信息资源检索与利用第二次作业
  8. python中popitem_什么是python popitem函数?示例解析
  9. Window Operations
  10. 第 7 章 Neutron - 069 - 理解 Neutron Server 分层模型
  11. MFC位图读取操作步骤记录
  12. 计算机进入安全模式的原因,电脑只能进入安全模式的原因及处理方法
  13. 路由器连接路由器怎么设置
  14. 乳腺数据DDSM标注overlay文件python处理
  15. 可解释机器学习(Explainable/ Interpretable Machine Learning)的原理和应用(李宏毅视频课笔记)
  16. 常用的嵌入式硬件通信接口协议(UART、IIC、SPI、RS-232、RS-485、RS-422、CAN、USB、IRDA)(二)
  17. Postgresql中的large object
  18. py218-基于Python+django的鲜花销售商城网站#毕业设计
  19. js判断json有没有某值_JS中判断JSON数据是否存在某字段的方法 JavaScript中判断json中是否有某个字段...
  20. 从服务上下载下的日志文件,用UltraEdit打开时中文是乱码解决方法

热门文章

  1. Ext.Net中CheckboxSelectionModel的动态隐藏(显示),一定条件下的隐藏(不让选择),获得多选栏位的信息,及后台控件的动态创建...
  2. 榜单类应用我所喜欢的算法
  3. 何时才有Email发布功能
  4. 后端小白的VUE入门笔记, 进阶篇
  5. [CodeForces1070C]Cloud Computing(2018-2019 ICPC, NEERC, Southern Subregional Contest )
  6. HTML 传输 字符转换 进制转换 15位 18位 时间戳 转换
  7. JavaScript(十三)面向对象
  8. 【转】Android必备知识点- Android文件(File)操作
  9. vuex 实现vue中多个组件之间数据同步以及数据共享。
  10. springmvc restful风格操作