第7章 异常处理
7.1 抛出异常
异常处理机制有两个主要部分:异常的鉴定与发出,异常的处理。
C++通过throw表达式产生异常:
inline void Triangular_iteratir:: check_integrity() { if(_index>=Triangular::max__elems) throw iterator_overflow(_index,Triangular::max_elems); … }
throw表达式看起来有点像函数调用。
所谓 异常,是某种对象,最简单的异常对象可以是整数或字符串。
throw 42;
throw “no buffer”;
7.2 捕获异常
使用单条或一串catch子句来捕获被抛出的异常对象。
catch子句由3部分组成:关键字catch、小括号内的一个类型或对象、大括号的一组语句(用来处理异常)。
如:catch(int errno){…}
catch(iterator_overflow &iof){…}
异常对象的类型会逐一和每个catch子句进行对比。类型符合则执行catch子句。
如果我们无法完成异常的完整处理,在记录信息之外,或许需要重新抛出(throw),,寻求其他catch的协助。
如果我们想捕获任何类型的异常,可以使用catch all方式catch(…)
catch(…){…}
7.3 提炼异常
catch子句和try块相应而生。 try块是以try开始,然后大括号一串语句,catch子句放在try块末尾。如果try块内发生异常,则由接下来的catch子句处理。
7.4 局部资源管理
auto_ptr是标准库提供的Class template,它会自动删除通过new分配的对象。
7.5 标准异常
如果new无法分配足够的内存,它会抛出bad_alloc异常对象。
标准库定义了一套异常类体系,其根部是名为exception的抽象基类。exception声明有一个what()虚函数,会返回一个const char*。用以表示被抛出异常的文字描述。