1、错误处理
一个函数检测到一个在局部无法处理的问题时,可以:
终止程序
返回一个表示错误的值
返回一个合法值,让程序处于某种非法状态
调用一个预先准备好的出现“错误”的情况下用的函数
但是各有不足,异常处理机制是在传统技术不充分、不优美和容易出错的时候,提供的一种替代它们的技术。异常处理机制可以看作是编译时的类型检查和歧义性控制机制在运行中的对应物。
异常处理机制是一种非局部的控制结构,基于堆栈回退,因此也可以看做是另一种返回机制。
2、异常
异常经常可以自然地形成一些族,这意味着可以借组继承来表示异常的结构。同时,一个异常可以同属两个组。
一个异常在抛出时将被复制,所以,处理器得到只是原始异常的一个副本。
派生异常可能被用于多于一个异常类型的处理器捕捉,在写try语句时需要注意处理器的排列顺序。
3、资源管理
处理资源申请和释放问题,可以利用带有构造函数和析构函数的类的对象。
利用局部对象管理资源的技术通常被说成是“资源申请即初始化”。这种技术依赖于构造函数和析构函数的性质,以及它们与异常处理的相互关系。
标准库提供了模板类auto_ptr,支持“资源申请即初始化”的技术。简言之,auto_ptr可以用指针去初始化,且能以与指针同样的方式间接访问,同时,在auto_ptr退出作用域时,被它所指的对象将被隐式地自动删除。
面对资源耗尽,程序员提供了两种风格的解决方案
唤醒:请求某个调用程序纠正问题,而后继续执行。
终止:结束当前计算并返回某个调用程序。
在c++里唤醒模型由函数调用机制支持,而终止模型由异常处理机制支持。
4、异常的描述
将可能抛出的异常作为函数声明的一部分 void f(int a) throw (x2,x3)
要覆盖一个具有异常描述的虚函数,这个函数所带的异常描述必须至少是与那个虚函数的异常描述一样受限。
设计良好的子系统常常将它的所有异常都从一个类派生出来。
通过将标准库异常std::bad_exception加入某个异常描述,来使unexpected()的行为修改为其他的能够接受的方式。
对未预期异常的响应由_unexpected_handler决定,它又是通过<exception>中的std::set_unexcepted()设置的。