WHAT?

主要思想:子程序不应因传入参数错误而被破坏

WHY?

保护程序免遭非法输入的破坏

HOW?

断言

assert denominator != 0 : "denominator should not be 0"; // 启动VM时需要 -ea 参数用以启动assert功能
  • 只用于开发、维护阶段
  • 用错误处理代码来处理预期会发生的状况,用断言来处理绝不会发生的状况
  • 避免把需要执行的代码放入断言中
  • 用断言来注解并验证前条件和后条件

错误处理技术

  • 返回中立值(当对返回结果准确性要求较低的时候)
  • 换用下一次正确的数据
  • 返回与前次相同的数据
  • 换用最接近的合法值
  • 记录日志
  • 返回错误码
    • 设置一个状态参数的值
    • 返回一个状态值
    • 使用语言内建的异常机制抛出一个异常
  • 关闭程序

健壮性与正确性

处理错误最恰当的方式要根据软件类别来确定

  • 健壮性(robustness):消费类应用软件
  • 正确性(correctness):关乎人身安全的软件

异常机制

  • 用异常通知程序的其它部分,发生了不可忽略的错误
  • 只在真正例外的情况下才抛出异常
  • 不能用异常来推卸责任,能在局部处理的错误就不要抛出
  • 避免在构造函数和析构函数中抛出异常
  • 在恰当的抽象层次抛出异常,确保异常的抽象层次和接口的抽象层次是一致的
  • 考虑集中的异常报告机制
  • 异常需要包含关于异常发生的所有背景信息

隔离程序

  • 公有方法假设数据不安全
  • 私有方法假设数据安全

《Code Complete》ch.8 防御式编程的更多相关文章

  1. cocos2d-x设计模式发掘之五:防御式编程模式

    http://www.ityran.com/archives/2105 本文由子龙山人原创,泰然授权转载,转载请注明出处并通知子龙山人! 声明:防御式编程是提高程序代码质量的一种手段,它不能算是真正意 ...

  2. 软件工程 - 防御式编程EAFP vs LBYL

    概念 EAFP:easier to ask forgiveness than permission LBYL:look before you leap 代码 # LBYL def getUserInf ...

  3. python2学习------基础语法3(类、类的继承、类成员函数、防御式编程)

    1.类的定义以及实例化 # 类定义 class p: """ this is a basic class """ basicInfo={&q ...

  4. code complete part1

    最近在看code complete,学习了一些东西,作为点滴,记录下来. 关于类: 类的接口抽象应该一致 类的接口要可编程,不要对类的使用者做过多的假设.不要出现类似于:A的输入量一定要大于多少小于多 ...

  5. Code Complete

    一.<代码大全>优先阅读参考顺序: 自学编程人:第07章 高质量的子程序 低年级学生:第11章 变量命名的力量 高年级学生:第08章 防御式编程 初级程序员:第18章 表驱动法 高级程序员 ...

  6. 【SQLSERVER学习笔记】进攻式编程

    一般的编程语言建议是进行防御式编程,在开始处理之前先检查所有参数的合法性.但实际上,对数据库编程而言,尽量同时做几件事情的进攻式编程有切实的优势.*/ --我们SP中常见的防御式编程示例:--场景一: ...

  7. Code Complete 读后总结和新的扩展阅读计划

    Code Complete 读后总结和新的扩展阅读计划 用了一年时间终于将代码大全读完了,在这里做一个简单的总结,并安排下一阶段的扩展阅读计划. 1.选择代码大全作为我程序员职业入门的第一本书,我认为 ...

  8. Code Complete阅读笔记(一)

    代码大全也读了好几个月了,一开始读中文版,到现在慢慢尝试着读原版,确实感受到了"每天进步一点点"的魅力.遗憾的是没有从一开始就做阅读记录,总有不能尽兴和思路不清之感.确实,就像项目 ...

  9. jQuery插件编写及链式编程模型

    jQuery插件编写及链式编程模型小结 JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我 ...

随机推荐

  1. EL表达式-例子

    <%@page import="java.util.*"%> <%@page import="java.util.ArrayList"%> ...

  2. OC-设计模式KVC+KVO定义及使用

    一.KVC Key-Value-Coding 键值编码(KVC:是一种存取值的方式,通过key存value 或者通过key获取value key从哪里来的呢? key 把对象里面的属性名.变量名当作了 ...

  3. of

    “查询序列的一个元素” 1. an element of the query sequence (T) 2. an query sequence element (T) "查询序列或者候选序 ...

  4. 106. Construct Binary Tree from Inorder and Postorder Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  5. Service代码示例

    package com.homily.training.service; import android.app.Service; import android.content.Intent; impo ...

  6. You need to use a Theme.AppCompat theme

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dji.sdk.sample/com.dji.sdk.sa ...

  7. room-views-用窗口颜色清除背景(Clear Background with Window Colour)选项

    这个选项是默认开启的,它的作用是在游戏每一帧绘制以前,都用一个颜色打底(覆盖整个游戏场景包括背景,从而实现背景清除),然后在这个基础上再画背景.场景等等. 如果关闭,则在游戏每一帧以前绘制背景(绘制背 ...

  8. Spark 1.4连接mysql诡异的问题及解决

    在spark-default.conf文件中明明配置了mysql的数据源连接 随后启动spark-shell 执行如下测试代码: import org.apache.spark.{SparkConte ...

  9. OpenCV实现KNN算法

    原文 OpenCV实现KNN算法 K Nearest Neighbors 这个算法首先贮藏所有的训练样本,然后通过分析(包括选举,计算加权和等方式)一个新样本周围K个最近邻以给出该样本的相应值.这种方 ...

  10. linux命令(8)kill命令

    kill命令: Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于 ...