垃圾进,垃圾不出或垃圾不进是目的。有三种方法:
1检查所有的外部数据的值,比如让整数溢出的值,字符串过长,让内存缓存溢出的数据。
当有这样的数据传来时,不接受。
2程序内部接口入口参数数据检查,和1本质上一样。
3决定如何处理垃圾的输入数据,如果已经接受了这种垃圾数据,怎么输出有个策略:
即使优先正确行还是程序的健壮性。比如是银行的交易系统,如果有垃圾数据,最好的办法是程序退出。
如果是娱乐网站,可以把数据处理成一个近似值或者猜测值,比如汽车的速度,当接到错误数据-9时,可以处理成0
断言:我的理解是在处理之前打个log,并且增加你已经知道的业务正确范围的控制语句
错误:错误的处理技术
返回中立值比如汽车的0
返回下一个正确的数据
返回上一次相同的数据
换用最接近的合法值
把警告信息记录到log里
返回错误码
关闭程序
异常
比如java的异常机制距离异常的集成关系如图所示:
蓝色的是runtime Exception,最常见的其实就是空值针异常、数组越界异常(包括字符串越界)、内存溢出。
这类异常不需要捕获,程序也能编译通过,防御式编程的思想是,在这些异常可能出现的地方就提前判断,
不知道怎么处理的地方可以异常捕获,打出log,后续处理。
其余红色的是checked Excption是jvm要求就必须try catch的异常,常见的包括IO关闭(文件,数据库)、classnofind异常。
最后作者的观点是:防御式编程也要注意度的概念,太多了影响代码质量阅读,而且防御石编程代码也可能带来问题。
进攻时编程我的理解是让这些问题可能存在的并且可能很严重的问题,先不去处理,让他暴漏出来:比如在catch中捕获到某个异常时候直接system.exit()
这样及早的发现问题,比到项目上线的时候才发现这个个问题要好。