exception

exception
异常:程序运行时,超出函数处理范围的反常行为。
当程序通过throw检测到问题,然后发出异常信号,之后的程序不再执行。(类似于return语句)CP684
使用异常处理时需要把异常处理的代码和正常运行的代码分离开来。CP173

//原代码
if(…==…)
   cout<<…<<endl;
//最好不用if else语句
if(…!=…)
   throw runtime_error("must refer");
cout<<…<<endl;

通过try block(try 语句块)的catch 子句处理异常。CP174

try{
   …
   if(…!=…)
      throw runtime_error("must refer");
   cout<<…<<endl;
}catch (runtime_error){
   …
}

stack unwinding(栈展开):沿嵌套函数的调用链逐层回退。(当异常抛出时,在抛出异常的函数中搜索是否有相匹配的catch子句(未必是最佳匹配CP687),没有找到终止该函数。到调用该函数的函数中查找。如果最终没有找到,程序执行terminate的标准库函数非正常退出。CP175)

E08 避免在析构函数中抛出异常:
当析构函数中必须执行1个可能抛出异常的动作,此时程序会结束执行或导致不明确行为。通过重新设计接口使用户有机会处理可能出现的异常。例如可以自行设计函数封装该动作,在析构函数中用异常处理调用该函数。EP47
在退出某个块时,编译器负责在块中创建的对象被正确销毁。但是执行throw后负责释放资源的代码可能被跳过。CP685

E29 异常安全函数的保证 (至少提供1个)

  • 基本保证:异常抛出时,程序内的任何事物能够保持有效状态。
class A{
public:
  void change(std::istream& ia);
  …
private:
  D d;
  std::shared_ptr<E> e;
  F f;
};
 void A::change(std::istream& ia)
 {
    funD(d);
    e.reset(new E(ia));
    //new成功之后才会调用reset函数释放e原来指向的对象
    funF(f);
    funD(d);
 }
  • 强烈保证:异常抛出时,程序能够恢复到调用函数之前的状态。
    利用copy and swap提供。
struct PMImpl{
  std::shared_ptr<E> e;
  F f;
}

class A{
public:
  void change(std::istream& ia);
  …
private:
  D d;
  std::shared_ptr<PMImpl> pimpl;
};
 void A::change(std::istream& ia)
 {
    using std::swap;
    funD(d);
    std::shared_ptr<PMImpl> 
        pNew(new PMImpl(pimpl));//先备份
    //修改副本
    pNew->e.reset(new E(ia));
    funF(pNew->f);
    //如果上述函数无法提供强烈保证,则整个函数无法提供强烈保证
    swap(pimpl,pNew);
    //注意复制的复杂度
    funD(d);
 }
  • nothrow:绝不抛出异常
    1.内置类型都提供此项保证。
    2.大部分函数考虑基本保证或者强烈保证
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值