C++ 中的异常处理要点

  • catch 异常时,C++不会通过相关“转换构造函数”来强行匹配,但可用父类匹配子类
  • 在catch中尽量使用引用,以免出现“切割”及不必要的拷贝
  • catch(...) 可以捕获一切,{throw;}可以将异常再次抛出
  • 没有catch可用时,或异常由析构函数抛出时,系统调用terminate(), 进而调用abort()终止程序。可通过set_terminate()替换terminate函数
  • 要确保构造函数不会抛出异常,否则析构函数不会调用,资源也就得不到释放
  • 了解auto_prt, smart_ptr的使用
  • “异常规格说明”可使函数调用者更直观地知道应当处理的异常。
    • void f() throw (Exception1, Exception2){}
    • 也可确保无异常:void f() throw(){};
    • 模板类并不使用此说明,因为实例类的行为尚未可知
    • 当函数抛出了不在列表中的异常时,默认调用unexpected() 函数,可使用set_unexpected设置行为
  • 继承来的方法不要在“异常规格说明”中新增新的异常类型(但可以使用已有异常的子类,总之保证兼容针对父类异常规格写的异常处理代码),要确保“is-a”原则的落实。
  • 异常会增加开销,请只在异常情况下使用
  • 尽量使用系统提供的异常类,或继承之
    • subclasses of logic_error
      • domain_error, invalid_argument, length_error, out_of_range, bad_cast, bad_typeid
    • subclasses of runtime_error
      • range_error, overflow_error, bad_alloc
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值