读书人

错误处理 Exception(C++Primer-chapte

发布时间: 2013-04-05 10:24:33 作者: rapoo

异常处理 Exception(C++Primer-chapter11)

11 异常处理

>异常处理是一种允许两个独立开发的程序组件在程序执行期间遇到程序不正常的情况时, 相互通信的机制.

11.1 抛出异常

>异常Exception是程序可能检测到的, 运行时刻不正常的情况. Ex. 被0整除, 数组越界访问, 空闲存储内存耗尽等;

>throw表达式后面跟的不能只是一个类型, Ex. class NoData {}; --> throw NoData; //Wrong; 异常是个对象, throw抛出的是一个class类型的对象, Ex. throw NoData(); //constructor creates a object;

>异常一般是class类型对象, 但throw表达式也可以抛出任何类型的对象, Ex. 枚举类型, enum State{ Error, NoError, Normal, }; -->throw Error;

11.2 try块

>try块(try block)必须包围能够抛出异常的语句; try块之后是一组处理代码, 称为catch子句;

>当某条语句抛出异常时, 在该语句后面的语句将被跳过; 程序执行权被转交给处理异常的catch子句; 如果没有catch子句能处理该异常, 程序执行权会被转交给C++标准库中定义的函数terminate();

>try块可以包含任何C++语句-表达式和声明; 一个try块引入一个局部域, 在try块内声明的变量不能在try块外别引用, 包括catch子句中;

>可以声明整个包含在try块中的函数; 这种情况下, 不是吧try块放在函数定义的内部, 而是把函数体整个包含在一个函数try块(function try block)中.

void test1(int) throw(EHState, string) {};void test2(int) throw(string) {};void noError(int) throw() {};                                                                                          void (*pf1) (int) throw(string) = &test1; // Wrong, test1's ES not as strict as pf1        void (*pf2) (int) throw(string) = &test2; // Correct, test2's ES same as pf2        void (*pf3) (int) throw(string)= &noError; // Correct noError's ES stricter than pf3

[PROBLEM]:我的g++编译器没有报错, 版本不支持规范?

11.5 异常与设计事项

>虽然异常处理是被内置语言支持的, 但不是每个C++程序都应当使用异常处理; 异常处理适合用在独立开发的不同程序部分之间, 用于不正常情况的通信;(Ex. 库函数中不能局部处理的意外情况, 抛出异常通知调用者);

>异常处理是容错系统实现中的主要辅助手段. 程序中的异常处理通常是分层的. 在一个层或组件中, 不是每个函数都能够处理异常. 通常, try块和catch子句被一个程序组件的入口点函数使用; catch子句处理当前组件中不适合传递给高层程序的异常;

---11 End---

OTHER

>new操作符失败会抛出bad_alloc类型的异常, 并且不会调用构造函数;

>一个引用的dynamic_cast失败, 会抛出一个bad_cast类型的异常;

>"std::uncaught_exception()" 事先判断当前是否存在已被抛出但尚未捕获的异常; Ex. if(!std:;uncaught_execption()) //没有未捕获的异常;

>异常对象不是创建在函数栈上, 而是在专用的异常栈上, 因此可以传递到上层函数;

>异常处理机制保证, 所有从try到throw语句之间构造起来的局部对象的析构函数会被自动调用, 清退堆栈; 如果没有找到匹配的catch子句, 系统调用terminate()终止整个程序, 这种情况则不能保证所有局部对象都正确销毁;

>catch块参数采用传引用的好处: 提高效率, 利用对象的多态性; 派生类的catch要放在基类的catch之前, catch(void*)要放在catch(...)前;

>编写异常说明时, 确保派生类成员函数的异常说明和基类成员函数的一致, 派生类改写的虚函数的异常说明要和对应的基类序函数异常说明相同或者更加严格;

<Refer to> http://blog.csdn.net/tuwen/article/details/2295853 & http://baiy.cn/doc/cpp/inside_exception.htm#异常捕获机制

读书人网 >C++

热点推荐