防御式编程
检查外部或上游程序传递过来的数据 避免程序被非法数据破坏
对于非法数据 要决定如何进行处理:
断言
assert a != 0 : "a cant be zero";
使用断言来处理绝对不会处理的情况,避免把需要执行的代码如方法调用放到断言里,避免断言被关闭时产生副作用。
更多地断言是在开发环境使用,在生产环境一般都会被关掉。
错误处理
当发生错误,如何处理错误数据?
- 返回默认值
- 使用数据流的下一个正确数据
- 使用最后一次正确的数据
- 使用最接近的合法值
- 重试
- 抛出异常
- 关闭程序
对于前四种方式,只有在替换数据对程序本身无害的情况下才能使用,使用这种方式时最好能输出相关信息,保证操作能被事后知悉,最后两种则是当替换数据会影响程序正确性的情况下才能使用,程序的健壮性与正确性二者只能取其一。
异常
- 必须携带导致异常发生的全部信息
- 禁止使用空catch
- 使用一个统一的方式处理未捕获的异常
程序隔离
辅助调试代码
- 在开发中失败更多 在生产上失败更少
通过在代码里添加一些只在开发环境会执行的代码来提早暴露问题
防御防御式编程
过多的防御式代码不仅会增加软件的复杂度 同时也会影响性能
- 保留检查重要错误的代码
- 尽量保证在生产环境出现错误可以自恢复