[读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(中)

继续整理最后一章的内容,这一篇是关于异常处理的。注:初学markDown,所得尚少,排版简陋,多多包涵欲支持异常处理,编译器的主要工作是找出catch子句,追踪程序堆栈中每一个函数的当前作用域,编译器必须提供某种查询异常对象的方法,以知道其实际类型(RTTI来源),最后,编译器还需要某种机制管理被丢出的对象,包括其产生,存储,析构,清理。C++异常处理语法由三部分组成: 1. throw,抛出异常
摘要由CSDN通过智能技术生成

继续整理最后一章的内容,这一篇是关于异常处理的。

注:初学markDown,所得尚少,排版简陋,多多包涵

欲支持异常处理,编译器的主要工作是找出catch子句,追踪程序堆栈中每一个函数的当前作用域,编译器必须提供某种查询异常对象的方法,以知道其实际类型(RTTI来源),最后,编译器还需要某种机制管理被丢出的对象,包括其产生,存储,析构,清理。

C++异常处理语法由三部分组成:
1. throw,抛出异常,其类型可以是内建类型,也可以是自定义类型。
2. 一个或者几个catch子句,每个catch子句用来表示要处理何种类型的异常,并在其紧接着的语句块中放置处理语句。
3. 一个try区段,里面的语句可能会抛出被特定类型的异常。

当一个,异常被抛出时,控制权会从当前作用域跳转出来,寻找合适的catch子句,若没有吻合的,默认的terminate()会被调用,当控制权被放弃后,堆栈中每一个函数调用会被弹出(pop up),这就是所谓的栈展开(stack unwind)。在每一个函数有脱离堆栈之前,函数的局部对象的析构函数会被调用。

此处涉及一个为什么在析构函数中不能抛出异常的问题,这是因为,如果该析构函数是由于上述的异常抛出导致的而被调用的,那么此时程序会直接terminate,因为处理异常的过程中又遇到了异常,此时无法进行合理的善后工作&#x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值