`
isiqi
  • 浏览: 16496971 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Item 29 异常安全

阅读更多

● 所谓“异常安全”,指的是当抛出异常时,要做到:
1> 资源无泄漏。申请的资源都释放掉。
2> 数据无破坏。数据都处于合法状态,不会出现无法解释的数据。

满足这两点,就做到了基本的“异常安全”。
如果能在异常发生时把程序返回到调用前的状态,那就做到了高级的“异常安全”。
如果能保证绝不抛出异常,那就是完美的“异常安全”。

● 如果某函数的异常列表是空的,表明它一旦出现异常,将是极严重的错误。比如:
int doSomething() throw();
此时,系统会自动调用unexpected_handler来处理异常。

● 一个用于多线程的菜单类:

上面的成员函数没做到那两点要求。如果new抛出bad_alloc异常,则:
1> 互斥锁就永远打不开了;
2> bgImage则指向了已经销毁的对象;
3> imageChanges非法地自增了。
所以,该函数不是异常安全的。

Item 13讲了如何用对象管理资源;Item 14讲了锁的释放。所以,函数可以改成:

这样,就解决了锁的问题。

bgImage要靠“资源管理类”才行:

1> 无需手动delete旧有的图像
2> 删除操作发生成新图像成功创建之后。因为reset要等new正常返回才能进入的。

这样,该函数达到了基本的“异常安全”。
为什么没有达到高级“异常安全”呢?因为在Image的构造中出现异常时,istream的状态还是无法恢复到以前。

copy and swap一般认为是达到高级“异常安全”的策略:

分享到:
评论

相关推荐

    Template_ Item Definition.doc

    在IT行业中,功能安全是确保系统在出现故障或异常情况时仍能正确运行的关键领域。"Function Safety Template"是一种用于指导开发过程的标准文档结构,它涵盖了从需求分析到安全计划的各个阶段。这份文档的主要目标是...

    Iterator遍历过程中list删除导致异常

    在Java编程中,`Iterator`是用于遍历集合(如`List`, `Set`等)的重要工具。然而,当我们尝试在使用`Iterator`遍历集合的过程中直接...同时,合理利用Java 8的流API可以有效避免这类异常,提高代码的可读性和安全性。

    listview中删除item的小例子

    - 在实现过程中,应考虑用户未选择任何item就点击删除,或者在数据为空时尝试删除等情况,为这些可能的异常情况提供合适的错误处理和提示。 通过以上步骤,我们可以实现这个"listview中删除item的小例子"。这个...

    全局异常捕获以及使用zedgraph控件绘图

    在这些事件处理器中,通常会记录异常信息,显示用户友好的错误消息,并可能尝试恢复程序状态或安全地关闭程序。 2. ZedGraph控件: ZedGraph是一个开源的.NET库,提供了丰富的图表类型,如线图、柱状图、饼图等,...

    python爬虫常见异常共1页.pdf.zip

    8. **Scrapy框架异常**: 使用Scrapy时,可能会遇到如Item字段不存在、中间件错误等特定异常。应遵循Scrapy的错误处理机制。 9. **异步爬虫的回调错误**: 异步爬虫如Scrapy-Redis、Aiohttp等在并发处理请求时,可能...

    More Exceptional C++

    异常安全性问题是C++程序员常常需要面对的问题,书中通过一系列的问题和解决方案,探讨了如何处理构造函数失败(Item17和Item18)、未捕获的异常(Item19)、裸指针的管理问题(Item20和Item21)等异常安全问题。...

    Sales_item.h-GCCpre-C++11compilers2012.zip

    同时,由于旧版本的GCC可能对模板和异常处理的实现与新版本有所不同,编写和调试涉及这些特性的代码时需额外留意。 总的来说,理解`Sales_item.h`在GCC pre-C++ 11环境中的工作原理和限制,对于学习和实践早期C++...

    Exceptional C++

    #### Item8-17:编写异常安全的代码 这一系列项目深入探讨了异常安全性的基本原则和技术,包括如何设计能够优雅地处理异常的代码。Alexandrescu讲解了各种异常安全模式,如RAII(资源获取即初始化)和“复制并交换”...

    Item上传照片demo

    10. **安全**:处理用户图片时,要确保数据安全,避免敏感信息泄露。例如,上传完成后应及时清理缓存,防止图片数据被其他应用访问。 综上所述,"Item上传照片demo"的开发涉及到了Android的多个核心组件和技术,...

    More Effecitve C++

    #### 引用计数(ITEM 29) 引用计数是一种常见的资源管理技术,用于跟踪共享资源的使用情况,当引用计数降为零时,资源会被自动释放。 #### 代理类(ITEM 30) 代理类用于封装对象访问,可以实现访问控制、缓存和...

    More Effective C++.pdf

    - **异常机制**:异常处理机制与普通控制流不同,需要特别注意异常安全性和性能影响。 - **性能考量**:异常抛出和捕获可能带来额外的性能开销,应在设计时予以考虑。 ##### 通过引用(REFERENCE)捕获异常 (Item ...

    More_Effective_C++

    - **异常安全**:即使构造过程中发生异常,也能保证资源被正确释放。 **5.3 Item 11:禁止异常信息传递到析构函数外** - **问题**:析构函数不应该抛出异常。 - **策略**:确保析构函数内部逻辑不会抛出异常。 **...

    千年3自动喊话(限制)_千年3item_千年_千年3自动喊话_

    同时,为了保证工具的稳定性和安全性,开发者还需要考虑如何防止反外挂系统的检测,以及如何处理可能的错误和异常情况。 总的来说,《千年3自动喊话》是一款旨在提升玩家游戏体验的辅助工具,涵盖了自动喊话、鼠标...

Global site tag (gtag.js) - Google Analytics