防御式编程
防御式编程
目录
防御式编程
为什么要防御式编程
- 编写大多数情况下都能用(可用)的代码很容易。但是提供意外输入会崩溃
- 正确的代码绝不会崩溃。但所有可能输入集合很大,难以测试;并非所有正确的代码都是优秀的代码,可能逻辑难以理解,并几乎无法维护
- 优秀的代码是健壮的、高效的、当然也是正确的。即便面对不常见输入,产品级代码也不会崩溃和产生错误结果
什么是防御式编程
通过预见到(或至少预先推测到)问题所在,断定代码中每个阶段可能出现的错误,并做出相应的防范措施,来防止类似意外的发生
断言
断言是什么
- 在开发期间使用的、让程序在运行时进行自检的代码
- 作为对开发人员的警告
- 通常是一个子程序或宏
- 断言为真,表示程序运行正常;为假,表示代码中出现了意料之外的错误
- 构成(两个参数)
- 布尔表达式:描述假设为真的情况
- 显示的信息:断言为假时(不是必须的!)
什么时候使用断言
- 断言主要用于开发和维护阶段
- 帮助查清相互矛盾的假定
- 预料之外的情况
- 传给子程序的错误数据等
- 生成产品代码时并不编译进去
- 不希望用户看到产品代码中的断言信息
- 同时避免降低系统性能
错误处理技术
为什么
- 错误可能而且必将发生
- 错误是预先就知道的,区别于程序中的bug –如想打开的数据库文件已被删除,磁盘空间已满…
- 用户错误
- 提供错误输入,或试图进行荒谬操作
- 程序员错误
- 是一种bug,由程序员引入的代码缺陷
- 意外情况
- 网络连接失败,打印机墨水用光等
有哪些错误处理技术
- 错误处理技术用来处理那些预料中可能要发生的错误情况
- 返回中立值(如数值返回0)
- 换用下一个正确的数据
- 返回与前次相同的数据
- 换用最接近的合法值 (如经度设置为(-180,180) 之间)
- 把警告信息记录到日志文件中
- 用语言内建的异常机制抛出一个异常
断言 vs 错误处理
- 断言处理代码中不应发生的错误
- 错误处理处理那些预料中可能发生的错误
异常
异常是什么
- 是把代码中的错误或异常事件传递给调用方代码的一种特殊手段
- 当遇到意料之外的情况,但不知道该如何处理时,可以抛出一个异常
- 同继承一样,谨慎使用可降低复杂度
- 基本结构
- 子程序使用throw抛出一个异常对象
- 被调用链上层其他子程序的try-catch语句捕获
隔离程序/隔栏
是什么
- 隔栏Barricade
- 以防御式编程为目的而进行隔离的一种方法
- 把某些接口选定为“安全”区域的边界,对穿越安全区域边界的数据进行合法性校验
- 隔栏可以将检验工作集中在特定的模块中,从而降低其它部分采用防御式编程的成本
隔栏 vs 断言 vs 错误处理
- 隔栏的使用使断言和错误处理有了清晰的区分
- 隔栏部分包含了“脏数据”
- 隔栏外部的程序应使用错误处理技术,在那里对数 据做的任何假定都是不安全的
- 通过隔离部分之后的是“干净数据”
- 隔栏内部的程序就应使用断言技术,因为传进来的数据应该己在通过隔栏时被清理过了
- 隔栏内子程序出现错误数据,就是程序里的问题