您的位置:首页 > 编程语言 > C语言/C++

C++ 之异常处理

2016-02-01 23:16 225 查看
基本理念:问题的检测和问题的解决分离,程序的问题检测部分可以不用了解如何处理问题

异常处理是一同通信机制,程序的不同部分就出现了什么错误进行通信;

异常是通过抛出(throw)对象而引发(raise)的,该对象的类型决定了应该激活哪个处理代码。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最为接近的那个。

异常以类似于将实参传递给函数的方式抛出和捕获。异常是可以传给非引用形参的任意类型的对象,这意味着必须能够复制该类型的对象。

不存在数组和函数类型的异常(数组和函数在作为参数传递时,会自动转换为指针)

执行thow 的时候,不会执行throw后面的语句,而是将控制从throw转移到匹配的catch, 故(1)沿着调用链的函数提早推出了,(2)一般而言,在处理异常时,抛出异常的块中的局部存储不存在了

沿着嵌套函数调用链向上寻找,为异常寻找匹配catch 子句的过程称为栈展开(stack unwinding)

catch(...) 是catch-all 子句,可以捕获所有类型的异常;

发生异常自动撤销局部对象,通过运行析构函数

用new 和delete 使用原始指针是不安全的,如果new 和delete 之间发生exception, 则delete 不会被执行,资源不会被撤销。

RAII(资源分配即初始化)是异常安全的(exception safe),即使发生异常,程序也能正常操作

RAII通过设计资源管理类,以构造函数分配资源而以析构函数函数释放资源

memory 头文件中定义的auto_ptr 模板类似RAII的一个实现

异常说明(exception specification)指定,如果函数抛出异常,被抛出的异常是包含在该说明中的一种,或是从列出的异常中派生的类型。

异常说明跟在函数形参表后,一个异常说明在关键字(throw)之后跟着一个(可能为空的)由圆括号括住的异常类型列表:

void recoup(int) throw (std::runtime_error);

空说明列表指出函数不抛出任何异常:

void recoup(int) throw();

如果一个函数没有指定异常说明,则该函数可以抛出任意类型的异常。

异常说明是函数接口的一部分,接口是对函数通信的一种归纳,故函数的返回类型,形参类型,异常说明构成函数接口。

违反异常说明将会导致调用标准库函数unexpected,unexpected 调用terminate 函数终止程序。

异常说明是函数类型的一部分,故完整的函数指针定义为:

void (*pf) (int) throw(std::runtime_error);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: