一、异常处理机制基础

  异常的定义

    程序中可以检测的运行不正常的情况

  异常处理的基本流程

    某段程序代码在执行操作时发生特殊情况,引发一个特定的异常

    另一段程序代码捕获该异常并处理它

二、异常的引发

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:异常处理机制的更多相关文章

  1. java学习笔记09--反射机制

    java学习笔记09--反射机制 什么是反射: 反射是java语言的一个特性,它允许程序在运行时来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来 ...

  2. WCF 学习笔记之异常处理

    WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...

  3. Storm学习笔记 - 消息容错机制

    Storm学习笔记 - 消息容错机制 文章来自「随笔」 http://jsynk.cn/blog/articles/153.html 1. Storm消息容错机制概念 一个提供了可靠的处理机制的spo ...

  4. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  5. [Java学习笔记] Java异常机制(也许是全网最独特视角)

    Java 异常机制(也许是全网最独特视角) 一.Java中的"异常"指什么 什么是异常 一句话简单理解:异常是程序运行中的一些异常或者错误. (纯字面意思) Error类 和 Ex ...

  6. [原创]java WEB学习笔记27:深入理解面向接口编程

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. Python学习笔记之异常处理

    1.概念 Python 使用异常对象来表示异常状态,并在遇到错误时引发异常.异常对象未被捕获时,程序将终止并显示一条错误信息 >>> 1/0 # Traceback (most re ...

  8. Oracle 学习笔记 17 -- 异常处理(PL/SQL)

    程序异常是在操作期间正常,出现在节目的准备过程是不可避免的例外.但是,必须有一个相应的异常处理机 制,以保证程序的正常运行.PL/SQL程序运行过程中出现的错误.称为异常. 一个优秀的程序都应该可以正 ...

  9. 《Head First Python》学习笔记03 异常处理

    异常(运行时错误): 当代码逻辑遇到意外事件时,比如打开一个文件,却发现文件不存在.这时是增加额外的代码处理逻辑,还是捕获异常呢?答案是:Python优先推荐捕获异常,然后恢复. Python异常机制 ...

随机推荐

  1. 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)

    1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...

  2. Lyft押重注于苹果编程语言Swift

    Lyft押重注于苹果编程语言Swift 1年后获得丰厚回报BI中文站 8月22日报道 一年多以前,打车应用Lyft做出重大决定,决心押重注于苹果开发的编程语言Swift,用这种编程语言重写其所有iPh ...

  3. keep the bar green to keep the code clean——Junit详解(一)

    测试用例 单元测试时每个开发人员必需掌握的,是保证开发过程中代码的准确性,无误性,保证代码质量.敏捷开发模式是先根据用户需求写测试用例,考虑基本所有用户所需要的情况,再写实现方法.单元测试有很多种,当 ...

  4. Python学习之路

    从今天开始学习Python,没有什么特殊的目的,只是觉得这门语言比较有意思,既然现在可能也不会用到,那就直接从Python3学起吧! 本人开始学习时,还是喜欢听别人讲,于是又找到了小甲鱼的<零基 ...

  5. java读取大文件

    1  多线程 2  java内存映射读取大文件

  6. 【转】Tomcat的默认访问路径

    放在外网的应用,用户多是直接输入域名访问,相信没有哪个后面还加个尾巴,而Tomcat的默认目录是ROOT,所以我们需要更改其默认目录. 更改Tomcat的默认目录很简单,只需要修改server.xml ...

  7. 菜单导航/URHere/面包屑,通过CSS中的content简洁表达代码

    比如我们要写一个菜单导航/URHere/面包屑,如: 首页 > 个人中心 > 修改密码 代码: <ul> <li><a href="javascri ...

  8. DOM4J的使用

    http://blog.csdn.net/redarmy_chen/article/details/12969219 http://blog.csdn.net/wlbing0625/article/d ...

  9. GoLang 通过http Post获取数据

    func GetPostResponse(url, bodyType string, body *[]byte) (rdata []byte, err error) { b := bytes.NewB ...

  10. Hadoop的数据输入的源码解析

    我们知道,任何一个工程项目,最重要的是三个部分:输入,中间处理,输出.今天我们来深入的了解一下我们熟知的Hadoop系统中,输入是如何输入的? 在hadoop中,输入数据都是通过对应的InputFor ...