[这个贴子最后由风灵风之子在 2006/06/07 02:30am 第 1 次编辑]
本文是对代码大全第二版本,第八章防御式编程的读书笔记
防御式代码编程的主要思想:子程序应该不传入错误数据而被破坏,哪怕是由其他子程序产生的错误数据。更一般的地说,其核心想法是要承认程序都会有问题,都需要被修改,聪明的程序员应该根据这一点来编写程序。
使用迭代式设计、编码前先写伪码、写代码前先写测试用例、底层设计检查等活动,都有助于防止引入错误。要在防御式编程之前优先使用这些技术,把防御式编程和其他编程技术结合起来使用。
1.断言
断言:是指在开发期间使用的、让程序在运行时进行自检的代码。
Java示例:- Assert denominator !=0:”denominator is unexpectedly equal to 0.”;
复制代码 C++示例:一个实现断言的宏- #define ASSERT( condition,message)
- {
- if (!(condition))
- {
- LogError(“Assertion failed:”,
- #condition,message);
- Exit(EXIT_FAILURE);
- }
- }
复制代码 断言通常用在以下情况:
(1)输入参数或输出参数的取值处于预期的范围内
(2)子程序开始(或者结束)执行时文件或流处于打开(或者关闭)的状态
(3)子程序开始(或者结束)执行时,文件或流的读写位置处于打开(或者结尾)处
(4)文件或流已用只读、只写或可读可写方式打开
(5)仅用于输入的变量的值没有被子程序所修改
(6)指针非空
(7)传入子程序的数组或其他容器至少能容纳X个数据元素
(8)表已初始化,存储着真实的数值
(9)子程序开始(或结束)执行时,某个容器是空的(或满的)
(10)一个经过高度优化的复杂子程序的运算结果和相对缓慢但代码清晰的子程序的运算结果相一致
断言主要用于开发和维护阶段,它只是在开发阶段被编译到目标代码中,而在生产产品代码时并不编译进去。
使用断言的建议:
(1)用错误处理代码来预期会发生的状况,用断言来处理决不应该发生的状况
(2)避免把需要执行的代码放到断言中
VB示例:一种危险的断言使用方法- Debug.Assert(PerformAction())
复制代码 VB示例:安全地使用断言- actionPerformed=PerformAction()
- Debug.Assert(actionPerformed)
复制代码 (3)用断言来注解并验证前条件和后条件
(4)对于高健壮性的代码,应该先使用断言再处理错误
2.错误处理技术
错误处理技术是处理那些预料得到可能发生的错误。
处理错误最恰当的方式要根据出现错误的软件的类别而定。错误处理方式有时候侧重于正确性,有时会侧重于健壮性。
即使你认定某个函数绝对不会出错,也无论如何要检查一下。防御式编程全部的重点就在于防御那些未曾预料到的错误
3.异常
异常是把代码中的错误或异常事件传递给调用方代码的一种特殊手段。
其基本结构是:子程序使用throw抛出一个异常对象,再被调用链上层其他子程序的try-catch语句捕获。
使用异常的一些建议
(1)用异常通知程序的其他部分,发生了不可忽略的错误。
其他的错误处理机制有可能会导致错误在不知不觉中向外扩散,而异常则消除了这种可能性
(2)只在真正例外的情况下抛出异常
(3)不能用异常来推卸责任
不要把本来可以在局部处理掉的错误当成一个为被捕获的异常抛出去
(4)避免在构造函数和析构函数中抛出异常,除非你在同一个地方把他们捕获
(5)在恰当的抽象层次抛出异常
(6)在异常消息中加入导致异常发生的全部信息
(7)避免使用空的catch语句
(8)了解所用库函数可能抛出的异常
(9)考虑创建一个集中的异常报告机制
(10)把项目中对异常的使用标准化
(11)考虑一场的替换方案
还没有写完,还有辅助代码调试等等,眼睛有点打架了,明天继续写。 |