-
保护程序免遭非法输入数据的破坏
- 检查所有来源于外部的数据的值
- 检查子程序所有输入参数的值
- 决定如何处理错误的输入数据
-
断言?
- 用错误处理代码来处理预期会发生的状况,用断言来处理绝不应该发生的状况
- 避免把需要执行的代码放到断言中
- 用断言来注解并验证前条件(Preconditions)和后条件(postconditions)
- 对于高建壮性的代码,应该先使用断言再处理错误
- 断言使用
-
错误处理技术
- 返回中立值
- 换用下一个正确的数据
- 返回与前次相同的值
- 换用最接近的合法值
- 把警告信息记录到日志中
- 返回一个错误码
- 调用错误处理子程序或对象
- 当错误发生时显示出错误消息
- 用最妥当的方式在局部处理措施
- 关闭程序
- 健壮性与正确性
- 高层次设计对错误处理方式的影响
- 错误处理技术的方法
-
异常
- 用异常通知程序的其他部分,发生了不可忽略的错误
- 只在真正例外的情况下才抛出异常
- 不能用异常来推卸责任
- 避免在构造函数和析构函数中抛出异常,除非你在同一地方把它们捕获
- 在恰当的抽象层次抛出异常
- 在异常消息中加入关于导致异常发生的全部消息
- 避免使用空的Catch语句
- 了解所用函数库可能抛出的异常
- 考虑创建一个集中的异常报告机制
- 把项目中对异常的使用标准化
- 考虑异常的替换方案
- 隔离程序,使之包容由错误造成的损害
-
辅助调试的代码
- 不要自动地把产品版的限制加强与开发版之上
- 尽早引入辅助调试的代码
- 采用进攻式编程
-
计划移除调试富足的代码
- 使用类似ant和make这样的版本控制工具和make工具
- 使用内置的预处理器
- 编写自己的预处理器
- 使用调试存根
-
确定在产品中代码中该保留多少防御式代码
- 保留那些检查重要错误的代码
- 去掉检查细微错误的代码
- 去掉可以导致程序硬性崩溃的代码
- 保留可以让程序稳妥地崩溃的代码
- 为你的技术支持人员记录错误信息
- 确认留在代码中的错误消息是友好的
- 对防御式编程采取防御的姿态
-
Key Points 要点
- 最终产品代码中对错误的处理方式要比“垃圾进,垃圾出”复杂得多
- 防御式编程技术可以让错误更容易发现,更容易修改,并减少错误对产品代码的破坏
- 断言可以帮助人尽早发现错误,尤其是在大型系统和高可靠性的系统中,以及快速变化的代码中
- 关于如何处理错误输入的决策是一项关键的错误处理决策,也是一种关键的高层设计决策
- 异常提供了一种与代码正常流程角度不同的错误处理手段。如果留心使用异常,它可以成为程序员知识工具箱中的一项有益补充,同时应该在异常和其他错误处理手段之间进行权衡比较
- 针对产品代码的限制并不适用于开发中的软件。你可以利用这一优势在开发中添加有助于更快地排查错误的代码