- 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
- subclasses of logic_error
C++ 中的异常处理要点
最新推荐文章于 2022-10-15 09:52:57 发布