防御式编程

防御式编程

防御式编程

为什么要防御式编程

  • 编写大多数情况下都能用(可用)的代码很容易。但是提供意外输入会崩溃
  • 正确的代码绝不会崩溃。但所有可能输入集合很大,难以测试;并非所有正确的代码都是优秀的代码,可能逻辑难以理解,并几乎无法维护
  • 优秀的代码是健壮的、高效的、当然也是正确的。即便面对不常见输入,产品级代码也不会崩溃和产生错误结果

什么是防御式编程

通过预见到(或至少预先推测到)问题所在,断定代码中每个阶段可能出现的错误,并做出相应的防范措施,来防止类似意外的发生

断言

断言是什么

  • 开发期间使用的、让程序在运行时进行自检的代码
    • 作为对开发人员的警告
    • 通常是一个子程序或宏
    • 断言为真,表示程序运行正常;为假,表示代码中出现了意料之外的错误
  • 构成(两个参数)
    • 布尔表达式:描述假设为真的情况
    • 显示的信息:断言为假时(不是必须的!)

什么时候使用断言

  • 断言主要用于开发和维护阶段
    • 帮助查清相互矛盾的假定
    • 预料之外的情况
    • 传给子程序的错误数据等
  • 生成产品代码时并不编译进去
    • 不希望用户看到产品代码中的断言信息
    • 同时避免降低系统性能

错误处理技术

为什么

  • 错误可能而且必将发生
    • 错误是预先就知道的,区别于程序中的bug –如想打开的数据库文件已被删除,磁盘空间已满…
  • 用户错误
    • 提供错误输入,或试图进行荒谬操作
  • 程序员错误
    • 是一种bug,由程序员引入的代码缺陷
  • 意外情况
    • 网络连接失败,打印机墨水用光等

有哪些错误处理技术

  • 错误处理技术用来处理那些预料中可能要发生的错误情况
    • 返回中立值(如数值返回0)
    • 换用下一个正确的数据
    • 返回与前次相同的数据
    • 换用最接近的合法值 (如经度设置为(-180,180) 之间)
    • 把警告信息记录到日志文件中
    • 用语言内建的异常机制抛出一个异常

断言 vs 错误处理

  • 断言处理代码中不应发生的错误
  • 错误处理处理那些预料中可能发生的错误

异常

异常是什么

  • 把代码中的错误或异常事件传递给调用方代码的一种特殊手段
    • 当遇到意料之外的情况,但不知道该如何处理时,可以抛出一个异常
    • 同继承一样,谨慎使用可降低复杂度
  • 基本结构
    • 子程序使用throw抛出一个异常对象
    • 被调用链上层其他子程序的try-catch语句捕获

隔离程序/隔栏

是什么

  • 隔栏Barricade
    • 以防御式编程为目的而进行隔离的一种方法
    • 把某些接口选定为“安全”区域的边界,对穿越安全区域边界的数据进行合法性校验
    • 隔栏可以将检验工作集中在特定的模块中,从而降低其它部分采用防御式编程的成本

隔栏 vs 断言 vs 错误处理

  • 隔栏的使用使断言和错误处理有了清晰的区分
  • 隔栏部分包含了“脏数据”
    • 隔栏外部的程序应使用错误处理技术,在那里对数 据做的任何假定都是不安全的
  • 通过隔离部分之后的是“干净数据”
    • 隔栏内部的程序就应使用断言技术,因为传进来的数据应该己在通过隔栏时被清理过了
    • 隔栏内子程序出现错误数据,就是程序里的问题

辅助调试的代码

原文地址:https://www.cnblogs.com/cpaulyz/p/14950915.html