C++学习笔记27:异常处理机制
一、异常处理机制基础
异常的定义
程序中可以检测的运行不正常的情况
异常处理的基本流程
某段程序代码在执行操作时发生特殊情况,引发一个特定的异常
另一段程序代码捕获该异常并处理它
二、异常的引发
throw
三、异常的捕获
try
{
...
}
catch(...)
四、异常类与异常对象
五、异常处理策略
异常类可以派生和继承,形成类库架构
可捕获的异常对象的型式
普通型式(包括类):异常对象需要拷贝
对某型式对象的引用:没有额外的拷贝动作
指向某型式对象的指针:要求对象动态构造或者在catch子句中可以访问
catch子句
- 可以有多个catch子句,每个负责捕获一种,一类或者全部异常
- 捕获一种:catch(int),catch(const char *)
- 捕获一类(该类或其派生类异常):catch(const EStackFull &)
- 捕获全部:catch(...)
- 所有catch子句按照定义顺序执行,因此派生异常类处理必须定义在基类之前,否则不会被执行
异常再引发
- 可以在基本任务完成后重新引发所处理的异常
- 主要用于在程序终止前写入日志和实施特殊的清除任务
try
{
throw AnException();
}
catch(...)
{
//...
throw;
}
栈展开
异常引发代码和异常处理代码可能属于不同的函数
当异常发生时,沿着异常处理块的嵌套顺序逆向查找能够处理该异常的catch子句
如果找到对应的catch子句,处理该异常
异常处理完毕后,程序保持catch子句所在的函数栈框架,不会返回引发异常的函数栈框架
函数栈框架消失时,局部对象被析构,但如果未执行delete操作,动态分配的目标对象未析构
未处理异常
所有未处理的异常由预定义的std::terminate()函数处理
可以使用std::set_terminate()函数设置std::terminate()函数的处理例程
void term_func() { exit(-); }
int main()
{
try
{
set_terminate(term_func);
throw "out of memory!";
}
catch (int)
{
/*...*/
}
return ;
}
//由于catch只能处理整数型的异常,因此字符串型的异常无法处理,交由term_func()函数处理;
//假设没有定义term_func()函数,则所有的无法处理的异常都交由操作系统处理
描述函数是否引发异常
- 否:throw()
- 是,引发任意型式的异常:throw(...)
- 是,引发某类异常:throw(T),部分编译器将其作为throw(...)
C++11规范
- 否:noexcept,等价于noexcept(true)
- 是:noexcept(false)
- 可能:noexcept(noexcept(expr)),expr为可转换为true或false的常数表达式
- C++11下,建议使用noexcept代替throw
六、异常描述规范
//例子
//类声明时将会引发异常的函数描述清楚
class JuStack
{
public:
int pop() throw(EstackEmpty);
void push(int value)throw(EStackFull);
};
C++学习笔记27:异常处理机制的更多相关文章
- java学习笔记09--反射机制
java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...
- WCF 学习笔记之异常处理
WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...
- Storm学习笔记 - 消息容错机制
Storm学习笔记 - 消息容错机制 文章来自「随笔」 http://jsynk.cn/blog/articles/153.html 1. Storm消息容错机制概念 一个提供了可靠的处理机制的spo ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
- [Java学习笔记] Java异常机制(也许是全网最独特视角)
Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...
- [原创]java WEB学习笔记27:深入理解面向接口编程
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Python学习笔记之异常处理
1.概念 Python 使用异常对象来表示异常状态,并在遇到错误时引发异常.异常对象未被捕获时,程序将终止并显示一条错误信息 >>> 1/0 # Traceback (most re ...
- Oracle 学习笔记 17 -- 异常处理(PL/SQL)
程序异常是在操作期间正常,出现在节目的准备过程是不可避免的例外.但是,必须有一个相应的异常处理机 制,以保证程序的正常运行.PL/SQL程序运行过程中出现的错误.称为异常. 一个优秀的程序都应该可以正 ...
- 《Head First Python》学习笔记03 异常处理
异常(运行时错误): 当代码逻辑遇到意外事件时,比如打开一个文件,却发现文件不存在.这时是增加额外的代码处理逻辑,还是捕获异常呢?答案是:Python优先推荐捕获异常,然后恢复. Python异常机制 ...
随机推荐
- 与Java互操作
课程内容涵盖了Java互操作性. Javap 类 异常 特质 单例对象 闭包和函数 变化性 Javap javap的是JDK附带的一个工具.不是JRE,这里是有区别的. javap反编译类定义,给你展 ...
- .htaccess下Flags速查表
Flags是可选参数,当有多个标志同时出现时,彼此间以逗号分隔. 速查表: RewirteRule 标记 含义 描述 R Redirect 发出一个HTTP重定向 F Forbidden 禁止对URL ...
- Hibernate实体关系映射(OneToMany、ManyToOne双边)——完整实例
双边关系是最常见的配置.在多方有一方的引用,一方也有多方的引用.双边关系能够很方便地查询数据.看一个班级与学生的双边关系. 班级(Clazz类)与学生(Student类):一对多关系.班级中有学生属性 ...
- 解析txt文本,dom4j工具输出为xml文档
有如下一个ttl.txt文本文档,每一行用空格隔开的三段分别代表主谓宾, 要将它们输出为xml格式文档 工具:dom4j,jar包导入MyEclipse的Java Project工程 代码如下: pa ...
- NPOI 导出Excel2007版本时出现流已关闭问题
NPOI生产.xlsx文件件时,在使用book.Write(ms);后,会关闭流,这样导致再次使用Respons输出流的时候就出错了. 我看到一些网友提供的解决办法是: public class NP ...
- javap反编译解释外部类直接使用内部类private字段的原理
2016-07-04 15:56:39 我们都知道: 1.内部类可以直接访问外部类的private字段和方法: 2.非静态内部类持有外部类的引用: 3.外部类可以直接访问内部类的private字段和方 ...
- 面试复习(C++)之冒泡排序
第一次写技术博客,先只贴代码吧. #include <iostream> using namespace std; void Bubble(int *arr,int len) { int ...
- .net版高斯模糊算法
最近挺多人找高斯算法,本人贴上一个高斯模糊算法类,希望可以帮助到大家.算法的效率还是可以接受的. #region 高斯模糊算法 /// <summary> /// 高斯模糊算法 /// & ...
- 【译】Permissions Best Practices Android M权限最佳做法
Permissions Best Practices PreviousNext In this document Consider Using an Intent Don't Overwhelm th ...
- The connection to adb is down, and a severe error has occured.问题解决方法小结
遇到了几次这个问题:The connection to adb is down, and a severe error has occured. You must restart adb and Ec ...