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

猜你喜欢

转载自blog.csdn.net/tangwing/article/details/8710622
今日推荐