CppPrimer笔记 Chapter18 用于大型程序的工具

CppPrimer笔记 Chapter18 用于大型程序的工具

标签: Cpp



异常处理(18.1)

  • 当执行一个throw时,跟在throw后的语句将不再被执行,相反,程序的控制权从throw转移到与之匹配的catch模块.这意味着
    • 沿着调用链的函数可能会提早退出
    • 一旦程序开始执行异常处理代码,则沿着调用链创建的对象将被销毁
  • 栈展开:沿着嵌套函数的调用链不断查找,直到找到了与异常匹配的catch子句,若一直没找到,退出main后查找过程终止.
  • 找到catch后,程序进入该子句并执行,完成后,找到与try块关联的最后一个catch子句之后的点,并从这里继续执行
  • 栈展开过程中,会运行类类型的局部对象的析构函数.由于析构函数为自动执行,他们不应抛出异常.若抛出异常,函数本身没有捕获该异常,则程序终止.

  • 异常时,可能构造函数只构造了一部分,数组或标准库正在初始化.这时要保证这部分元素正确地被销毁.像new的空间若在delete前异常,则不会释放.
  • 编译器使用异常排除表达式对异常对象进行拷贝初始化.因此throw语句中的表达式必须有完全类型.必须含有一个可访问的析构与拷贝或移动构造函数.
  • 异常类型位于编译器管理的空间中,以确保无论最终调用的是哪个catch子句都能访问该空间.异常处理完毕后,异常对象被销毁.
  • 防止抛出的指针在栈展开过程中被销毁.
  • 通常情况下,若catch接受的异常与某个继承体系有关,则最好将该catch的参数定义成引用类型
  • catch匹配规则
    • 允许从非常量向常量的类型转换
    • 允许从派生类向基类的类型转换
    • 数组被转换成指向数组(元素)类型的指针,函数被转换成指向该函数类型的指针.
      其它的包括算数类型转换与类类型转换都不允许
  • 若多个catch语句类型间存在着继承,则应该吧继承链最低端(派生类)放在前面,最顶端(基类)放在后面.
  • 利用throw;语句重新抛出.将当前的异常对象沿着调用链向上传递.
  • 重新抛出时,只有当catch异常声明是引用类型时我们对参数所做的改变才会被保留并继续传播
  • catch(...){}语句捕获所有异常,一般与throw;重新抛出一起使用,先自己执行局部能完成的工作没然后重新抛出异常

  • 为了能处理初始化列表抛出的异常,将构造函数写成函数try语句块
    B::B(initializer_list<int> il)try:data(make_shared<vector<int>>(il){}
    catch(const bad_alloc&e){handle_out_of_memory(e);}
  • 利用noexcept表明函数不会抛出异常.应在函数所有声明语句与定义语句中出现.位置与使用如下
    auto recoup(int) //const &&
    throw()//final override =0
    ->int;
    auto recoup(int) throw()->int{return 1;}
  • noexcept函数抛出了异常,编译器不会警告,程序会直接终止
  • noexpect说明符常与noexpect运算符一起使用.表明不抛出异常的依赖关系.
    noexpect说明符可接受一个可转成bool参数,若为true,则为不抛出异常.
    noexpect运算符是一元运算符,返回bool右值常量表达式.和sizeof一样,并不会求其运算对象的值.
    `vodi f()noexcept(noexpect(g()));//f和g异常说明一致
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值