继续整理最后一章的内容,这一篇是关于异常处理的。
注:初学markDown,所得尚少,排版简陋,多多包涵
欲支持异常处理,编译器的主要工作是找出catch子句,追踪程序堆栈中每一个函数的当前作用域,编译器必须提供某种查询异常对象的方法,以知道其实际类型(RTTI来源),最后,编译器还需要某种机制管理被丢出的对象,包括其产生,存储,析构,清理。
C++异常处理语法由三部分组成:
1. throw,抛出异常,其类型可以是内建类型,也可以是自定义类型。
2. 一个或者几个catch子句,每个catch子句用来表示要处理何种类型的异常,并在其紧接着的语句块中放置处理语句。
3. 一个try区段,里面的语句可能会抛出被特定类型的异常。
当一个,异常被抛出时,控制权会从当前作用域跳转出来,寻找合适的catch子句,若没有吻合的,默认的terminate()会被调用,当控制权被放弃后,堆栈中每一个函数调用会被弹出(pop up),这就是所谓的栈展开(stack unwind)。在每一个函数有脱离堆栈之前,函数的局部对象的析构函数会被调用。
此处涉及一个为什么在析构函数中不能抛出异常的问题,这是因为,如果该析构函数是由于上述的异常抛出导致的而被调用的,那么此时程序会直接terminate,因为处理异常的过程中又遇到了异常,此时无法进行合理的善后工作&#x