《代码大全》学习之--防御式编程
2011-09-26 20:17
183 查看
防御式编程的核心思想是:子程序不应该因为错误数据而被破坏,哪怕是由其它子程序所产生的错误数据。
1. 保护程序免遭非法输入数据的破坏
(1)检查所有来源于外部的数据值:确保外部数据合法,在允许的范围内。
(2)检查子程序所有输入参数的值
(3)决定如何处理错误的输入数据
2.断言
断言(Assertion)是在开发期间使用的,让程序在运行时进行自检的代码(通常是一个子程序或者宏)。断言为真,表示程序运行正常,断言为假,则意味着它已经在代码之中发现了意料之外的错误。
断言可以用来处理如下的假定:
a.输入参数或者输出参数的取值处于预期的范围内:这种处理很有必要,也是最常见的方式
b.子程序开始(或者结束)执行时,文件或流的读写位置处于开头或者结尾处
c.子程序开始(或者结束)执行时,文件或流是处于打开(或关闭)的状态
d.文件或流已用只读、只写或可读可写方式打开
e.仅用于输入的变量的值没有被子程序所修改
f.指针非空:这种处理平时用的也比较多
g.传入子程序的数组或其它容器至少能容纳X个数据元素
h.表已经初始化,存储着真实的数值
i.子程序开始(或结束)执行时,某个容器是空的(或满的)
j.一个经过高度优化的复杂子程序的运算结果和相对缓慢但代码清晰的子程序的运算结果一致
使用断言的指导性建议:
(1)用错误处理代码来处理预期会发生的状况,用断言来处理绝不应该发生的状况:错误处理主要用来处理有害的数据输入,它是可以预期的;断言主要是用来检查代码本身的问题(bug),它是不应该发生的状况。
(2)避免把需要执行的代码放到断言中
(3)用断言来注解并验证先条件和后条件
(4)对于高健壮性的代码,应该先使用断言再处理错误(这一条用得很少)
3.错误处理技术
一段断言用来处理代码中不应发生的错误,错误处理代码用来处理预料中可能发生的错误。
常用的错误处理技术:
(1)返回中立值
(2)换用下一个正确的数据
(3)返回与前次相同的数据
(4)换用最接近的合法值
(5)把警告信息记录到日志文件中
(6)返回一个错误的代码:(a 设置一个状态变量的值,b 用状态值作为函数的返回值 c 用语言内建的异常机制抛出一个异常)
(7)调用错误处理子程序或对象(详见《代码大全》196页)
(8)当错误发生时显示出错消息
(9)用最妥当的方式在局部处理错误
(10)关闭程序(在一些重要的场合,关闭程序比给出错误的数据更好)
4.异常
异常是把代码中的错误或异常事件传递给调用方代码的一种特殊手段。异常用得好的话可以降低复杂度,但如果用得不好的话会使代码变得几乎无法理解。
(1)用异常通知程序的其它部分,发生了不可忽略的错误
(2)只在真正例外的情况下才抛出异常
(3)不能用异常来推卸责任
(4)避免在构造函数和析构函数中抛出异常,除非你在同一地方将他们捕获
(5)在异常消息中加入关于导致异常发生的全部信息
需要注意的是,在开发版本中可以牺牲一些速度和对资源的使用,来换取一些让开发更顺利的内置工具。
1. 保护程序免遭非法输入数据的破坏
(1)检查所有来源于外部的数据值:确保外部数据合法,在允许的范围内。
(2)检查子程序所有输入参数的值
(3)决定如何处理错误的输入数据
2.断言
断言(Assertion)是在开发期间使用的,让程序在运行时进行自检的代码(通常是一个子程序或者宏)。断言为真,表示程序运行正常,断言为假,则意味着它已经在代码之中发现了意料之外的错误。
断言可以用来处理如下的假定:
a.输入参数或者输出参数的取值处于预期的范围内:这种处理很有必要,也是最常见的方式
b.子程序开始(或者结束)执行时,文件或流的读写位置处于开头或者结尾处
c.子程序开始(或者结束)执行时,文件或流是处于打开(或关闭)的状态
d.文件或流已用只读、只写或可读可写方式打开
e.仅用于输入的变量的值没有被子程序所修改
f.指针非空:这种处理平时用的也比较多
g.传入子程序的数组或其它容器至少能容纳X个数据元素
h.表已经初始化,存储着真实的数值
i.子程序开始(或结束)执行时,某个容器是空的(或满的)
j.一个经过高度优化的复杂子程序的运算结果和相对缓慢但代码清晰的子程序的运算结果一致
使用断言的指导性建议:
(1)用错误处理代码来处理预期会发生的状况,用断言来处理绝不应该发生的状况:错误处理主要用来处理有害的数据输入,它是可以预期的;断言主要是用来检查代码本身的问题(bug),它是不应该发生的状况。
(2)避免把需要执行的代码放到断言中
(3)用断言来注解并验证先条件和后条件
(4)对于高健壮性的代码,应该先使用断言再处理错误(这一条用得很少)
3.错误处理技术
一段断言用来处理代码中不应发生的错误,错误处理代码用来处理预料中可能发生的错误。
常用的错误处理技术:
(1)返回中立值
(2)换用下一个正确的数据
(3)返回与前次相同的数据
(4)换用最接近的合法值
(5)把警告信息记录到日志文件中
(6)返回一个错误的代码:(a 设置一个状态变量的值,b 用状态值作为函数的返回值 c 用语言内建的异常机制抛出一个异常)
(7)调用错误处理子程序或对象(详见《代码大全》196页)
(8)当错误发生时显示出错消息
(9)用最妥当的方式在局部处理错误
(10)关闭程序(在一些重要的场合,关闭程序比给出错误的数据更好)
4.异常
异常是把代码中的错误或异常事件传递给调用方代码的一种特殊手段。异常用得好的话可以降低复杂度,但如果用得不好的话会使代码变得几乎无法理解。
(1)用异常通知程序的其它部分,发生了不可忽略的错误
(2)只在真正例外的情况下才抛出异常
(3)不能用异常来推卸责任
(4)避免在构造函数和析构函数中抛出异常,除非你在同一地方将他们捕获
(5)在异常消息中加入关于导致异常发生的全部信息
需要注意的是,在开发版本中可以牺牲一些速度和对资源的使用,来换取一些让开发更顺利的内置工具。
相关文章推荐
- 《代码大全》学习摘要(三)防御式编程
- 《代码大全》学习――三四而后行:前期准备
- 《代码大全》学习笔记 第八章,防御式编程
- 《代码大全》学习进度
- 《代码大全》学习摘要(四)伪代码编程过程
- 代码大全学习-11-防御式编程(Defensive Programming)
- 代码大全学习-22-常见的控制问题(General Control Issues)
- 读《代码大全》第2版 第 8 章,防御式编程
- 《代码大全》学习-第1章 欢迎进入软件构建的世界
- 《代码大全》学习之--可以工作的类
- 《代码大全》学习之--使用条件语句
- 《代码大全》学习摘要(四)伪代码编程过程
- 《代码大全》学习摘要(五)软件构建中的设计(下)
- 《代码大全》学习-第2章 用隐喻来更充分地理解软件开发
- 代码大全学习-34-自注释的代码(Self-Documenting Code)
- 代码大全学习总结——防御式编程
- 《代码大全》学习摘要(五)软件构建中的设计(下)
- 《代码大全》笔记--防御式编程
- 伙伴们快去学习《代码大全》吧
- 《代码大全》学习摘要(二)基本数据类型