exception
来源:互联网 发布:2016淘宝前期扶持 编辑:程序博客网 时间:2024/05/17 22:27
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
- Exception
- Exception
- Exception
- exception
- Exception
- Exception
- Exception
- exception
- Exception
- Exception
- Exception
- Exception
- exception
- exception
- exception
- Exception
- Exception
- Exception
- Python IDLE 自动提示功能
- BZOJ 1190 梦幻岛宝珠 [01背包][二进制优化]
- PHP中include()与require()的区别说明
- Tomcat安装及启停
- 在cmd中运行.py文件: python
- exception
- MMU虚拟内存到物理内存
- iOS程序员泪崩的一天
- 优酷UE4教程
- android版本过高导致下载软件后无法自动安装
- 'module' object has no attribute 'fork'
- SpringMVC使用AbstractExcelView导出Excel
- pat-a1076. Forwards on Weibo (30)
- 统计文件内的字符数,单词数,行数