清华大学出版社《c++程序设计》(第三版)中简单总结的一些知识点
-
异常处理:
try:将可能出错并产生异常的代码放在try块中,try块后面跟着一个或多个catch块
catch:每个catch块捕捉和处理一种异常,如果try块有异常抛出,则程序离开try块在其后的catch块中逐个搜索合适的异常处理器。没有异常抛出,则执行所有catch块之后的语句
throw:抛出异常 -
异常对象的抛出与传播:
○ throw后面通常跟一个操作数,表示要抛出的异常。如果抛出的是一个对象(异常对象),指定捕获相应类型类型的最近的一个异常处理器捕获该异常,try块的异常处理器(catch块)紧接在try块后面。如果抛出异常,找不到类型符合的异常处理器,系统就会调用terminate函数。
○ terminate函数默认调用abort函数终止程序执行。
○ 抛出异常时,throw语句生成异常对象的一个副本,即一个临时对象,异常处理器执行完毕后删除该临时对象。
○ 异常对象的嵌套,异常对象先在内层try块后面catch块中寻找符合要求的异常处理器,没有则跳到外层寻找 -
异常的捕获和处理:
catch(参数类型 参数名)
○ catch(Myobj &e) 即传引用方式,e就是throw语句产生对象的引用(和上面说的副本不一样哦)
○ catch(Myobj e) 传值方式,将调用类的复制构造函数,用throw语句产生的对象再生成一个新对象e,此时e是抛出的异常对象的副本,如果抛出的是一个局部动态对象,则程序转到异常处理器中时,异常对象已被撤销,副本在异常处理器执行完毕后被撤销。
○ catch(int e) 捕捉整形异常
○ catch(int)能捕获到整形异常,但不能获得,但不能获得抛出的整形异常对象的大小
○ catch(…)能捕捉任何类型的任何异常
○ 没能捕捉则将调用terminate函数默认调用abort,也能使用set_terminate函数指定调用的函数
○ 多个异常处理器能匹配那就要看顺序了
○ 异常处理器参数类型和异常类型满足:类型完全一样,参数是抛出的(对象/派生类对象的指针或引用)的(基类/基类指针或引用),参数是void *抛出的是某一种类型的指针,catch(…) -
栈解旋(unwinding)
异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反,这-过程称为栈的解旋(unwinding)。* -
异常对象的生命周期:
抛出的时候可以采用匿名对象
○ 普通类型元素:普通元素异常对象catch处理完之后就析构
○ 引用:引用的话不用调用拷贝构造,异常对象catch处理完之后就析构
○ 指针:直接抛出对象的取址,catch指针,这样会使得对象没有在catch处理中执行就被析构了,可以throw一个new 对象,在catch处理完过后手动清理