C++增加了 exceptions 性质后,深远而根本地、并可能令人不舒服地改变了许多事情。例如,原始指针的使用如今竟成为一种高风险行为,资源泄漏(resource leaks)的机会大增,撰写符合期望的 constructors和 destructors的难度也大增。程序员必须特别小心,防止程序在执行时突然中止。可执行文件和程序库变得更大、速度更慢。

上述所言都只是我们知道的事情而已。欲将 exceptions 纳入程序设计考虑,还有许多 C++社区所不清楚的相关事务,其中最大的部分就是不知如何正确掌握它。至今尚未有某种技术被大家公认,一旦常态性地施行后,便能够引导软件行为在“exceptions 被抛出”时可预期并且稳定。(如果想深入这些主题,请参考本书p287所推荐的 Tom Cargill 文章。如果想知道这些主题的最新突破,请看 Jack Reeves发表于 C++Report,1996/03 的文章,以及 Herb Sutter发表于C++Report,1997/09,11,12的文章。)

我们都很清楚一点:程序之所以在 exceptions 出现时仍有良好行为,不是因为碰巧如此,而是因为它们加入了 exceptions 的考虑。“面对 exception 依然安全(所谓 exception-safe)”的程序并非是意外诞生的。一个程序如果没有针对exceptions 特别做设计,却要求它在 exceptions 出现时有良好的行为,那就好像未针对多线程(multiple threads)做设计,却希望多线程发生时能够有良好表现一样:痴人说梦!

回过头来说,为什么使用 exceptions?自从 C 发明以来,C 程序员用来避免错误的程序技术已经够多的了,为什么要再招惹 exceptions?尤其如果它们像我说的那样带来一大堆问题的话?答案很简单:exceptions 无法被忽略。如果一个函数利用“设定状态变量”的方式或是利用“返回错误码”的方式发出一个异常信号,无法保证此函数的调用者会检查那个变量或检验那个错误码。于是程序的执行可能会一直继续下去,远离错误发生地点。但是如果函数以抛出 exception 的方式发出异常信号,而该 exception 未被捕捉,程序的执行便会立刻中止。

C 程序员唯有以 setjmp 和 longjmp 才能近似这样的行为。但是 longjmp在 C++中有一个严重缺陷:当它调整栈(stack)的时候,无法调用局部(local)对象的destructors。大部分 C++程序很依赖这些 destructors 被调用,所以 setjmp和longjmp 对真正的 exceptions 而言不是个良好的替代品。如果你需要一个“绝对不会被忽略的”异常信号发射方法,而且发射后的 stack处理过程又能够确保局部对象的 destructors 被调用,那么你需要 C++exceptions。它是最简单的方法了。

关于如何撰写 exceptions-safe 程序,我们有很多需要学习。以下所列条款只能架构出一个不很完全的“exception-safe 软件”设计指南。尽管如此,它们介绍了在C++中使用 exceptions 时的许多重要考虑。只要留意以下指引,你就可以改善软件的正确性、稳健性、效率,而且你可以避开许多因 exceptions 而产生的问题。

条款 9:利用 destructors避免泄漏资源

对指针说拜拜。承认吧,你从未真正喜欢过它,对不?

好,你不需要对所有指针说拜拜,但是你真的得对那些用来操控局部性资源(local resources)的指针说莎唷娜拉了。举个例子,你正在为“小动物收养保护中心”(一个专门为小狗小猫寻找收养家庭的组织)编写一个软件。收养中心每天都会产生一个文件,其中有它所安排的当天收养个案。你的工作就是写一个程序,读这些文件,然后为每一个收养个案做适当处理。

合理的想法是定义一个抽象基类(abstract base class) ALA ("Adorable Little Animal"),再从中派生出针对小狗和小猫的具体类(concrete classes)。其中有个虚函数 processAdoption,负责“因动物种类而异”的必要处理动作。

03异常(Exceptions)异常相关推荐

  1. Exceptions 异常

    ※ 前言 尽管人人都希望所处理的事情能顺利进行,所操纵的机器能正常运转,但在现实生活中总会遇到各种异常情况.例如职工小王开车去上班,在正常情况下, 小王会准时到达单位.但是天有不测风云,在小王去上班时 ...

  2. 简单介绍Go语言错误处理异常捕获+异常抛出

    这篇文章主要介绍了Go语言错误处理异常捕获和异常抛出,Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现了函数可以返回错误类型以及简单的异常捕获,虽然简单但是也非常精妙,大大的提高了运 ...

  3. Java异常之异常机制

    2019独角兽企业重金招聘Python工程师标准>>> Java异常处理机制依赖5个关键字try,catch,finally,throw,throws.try关键字后跟着可能出现异常 ...

  4. python循环捕捉异常_python异常捕捉以及处理

    看标题觉得高大上,好像能处理所有的异常.但是,事实是只能按照字面的意思来理解这一段话. 众所周知写代码哪有不出bug的? 那么出现了bug 我们不想让程序因为bug的存在而退出.那么要怎么做呢? 今天 ...

  5. java怎么捕捉除数异常_Java异常的捕获及处理---小总结

    一:异常的基本概念 二:异常的基本处理格式 三:异常的继承结构 四:Java的异常处理机制 五:throws和throw关键字的作用 六:Exception和RunntimeException的区别 ...

  6. C++ 面向对象(三)异常 :异常概念、异常的匹配规则、异常安全、异常体系

    目录 C语言传统的错误处理方法 异常的概念 异常的匹配规则 异常安全 异常规范 异常体系 C++标准库的异常体系 自定义异常体系 C语言传统的错误处理方法 在C语言中,因为没有异常这个机制,所以出现错 ...

  7. 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)

    多态的概念: 多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果. 多态存在的三个必要条件: ① 需要存在继承或实现关系 ② 同样的方法调用而执行不同的操作.运行不同代码(重写 ...

  8. 软件测试抛出异常,异常测试之异常注入初探

    背 景 常规的功能测试,主要关注业务的正常逻辑是否能够走通,往往忽视了各种异常对服务造成影响,因此需要提高异常测试的关注度.异常测试包括很多方面,有服务器系统异常.依赖服务异常.应用本身异常等. 服务 ...

  9. assertionerror是什么异常_php7异常与错误处理和自定义异常

    7.2版本异常与错误的概述 什么叫做异常? 异常是指程序运行中不符合预期情况以及与正常流程不同的状况. 比如你链接数据库,在参数都写上去的条件下,发现链接不上去,这就属于不符合预期. 可以被 try- ...

  10. Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法

    Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法 参考文章: (1)Java并发--ConcurrentModificationExce ...

最新文章

  1. iphone相册怎么加密_iphone相册加密码锁,保护隐私
  2. ubuntu截图工具
  3. PermissionError: [Errno 13] Permission denied: ‘name.pdf‘
  4. bool 变量想为什么一般初始化为FALSE 比较好?
  5. 无障碍开发(七)之实例讲解
  6. velocity 遍历map
  7. 08 域控 架构主机 转移_域控制器的角色转移与抢占
  8. wpsppt如何虚化图片_PPT模仿之路——图片以及笔画的虚化
  9. ArcGIS Engine中如何获取Map中已经选择的要素呢(转)
  10. 服务端如何防止订单重复支付?
  11. kylin_异常_02_java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf 解决办法
  12. 初识UNIX操作系统
  13. 《人人都是产品经理》——第一章笔记
  14. tecplot批量导出图片_科研画图工具Tecplot使用教程
  15. DOS 批处理高级教程精选合编20080331
  16. 关于博弈论的硬币问题
  17. 七款好看文字样式纯css
  18. 开题报告、论文摘要、摘要翻译、论文结论怎么写?
  19. 关于word中插入的mathtype公式变形问题的解决方案
  20. ccna综合实验实训总结_CCNA实训总结

热门文章

  1. 小学二年级计算机课游戏,[小学二年级适合玩的课堂游戏] 适合小学生的课堂游戏...
  2. IEEE-754单精度浮点类型详解(完结篇)
  3. redis的字典(Hash)
  4. Windows查看网络连接并清理缓存
  5. 【Raw use of parameterized class ‘xxx‘ 】
  6. 国内外遥感类核心期刊汇总
  7. csp认证201903-1--小中大(c++)
  8. .hpp文件和.h文件的区别
  9. 《论文阅读笔记》Attention Bottlenecks for Multimodal Fusion
  10. 制造业ERP系统如何帮助企业做好生产物料管控?