一、保护程序免遭非法数据的破坏
检查所有来源于外部的数据的值
当从文件、用户、网络或其他外部接口中获取数据时,应检查所获得的数据值,以确保它在允许的范围内
1.1 数值在可接受的取值范围内
1.2 字符串不超长,确保其值合乎用途(比如交易ID)检查子程序所有输入参数的值
和检查来源于外部数据的数值一样,只不过数据是来源于其他子程序而非外部接口
决定如何处理错误的输入数据
详见8.3节“错误处理技术”“”
二、断言
定义:断言是指在开发期间使用的、让程序在运行时进行自检的代码(通常是一个子程序或宏)
断言为真:程序运行正常
断言为假:在代码中发现了意料之外的错误
优点:断言对于大型的复杂程序或可靠性要求极
高的程序来说尤其有用。通过使用断言, 程序员能更快速地排查出因修改代码或者别的原因,而弄进程序里的不匹配的接口假定和错误等。
使用断言的指导建议:
- 用错误处理代码来处理预期会发生的状况,用断言来处理绝不应该发生的状况,断言是用来检查代码中的bug
- 避免把需要执行的代码放到断言中
- 用断言来注解并验证前条件和后条件
前条件:子程序或类的调用方代码在调用子程序或实例化对象之前要确保为真的属性。前条件是调用方代码对其所调用的代码要承担的义务
后条件:子程序或类在执行结束后要确保为真的属性。后置条件是子程序或类对调用方代码所承担的责任 - 对于高健壮性的代码,应该先使用断言再处理错误
对于每种可能出错的条件,通常子程序要么使用断言,要么使用错误处理代码来进行处理,但是不会同时使用二者。
三、错误处理技术 ##
断言可以用于处理代码中不应发生的错误。错误处理技术是处理预料中可能要发生的错误
- 返回中立值
处理错误数据的最佳做法是继续执行操作并简单地返回一个没有危害的数值。比如,数值计算可以返回0,字符串操作可以返回空字符串,指针操作可以返回一个空指针。 - 换用下一个正确的数据
如果在读数据库并发现其中一条记录已经损坏时,可以继续读下去直到找到一条正确记录为止。 - 返回与前次相同的数据
例:体温计读取软件在某次读取中没有获得数据,那么它可以简单地返回前一次的读取结果。 - 换用最接近的合法值
如果你检测到一次小于0的读取结果,那你可以把它替换为0,即最接近的那个合法值。如果发现结果大于100,那么你可以把它替换为100。在操作字符串时,如果发现某个字符串的长度小于0,也可以用0代替。比如倒车时,速度无法显示负的速度,此时可显示为0 - 把警告信息记录到日志文件中
检查到错误数据时,可选择在日志文件中记录一条警告信息 - 返回一个错误码
可以决定只让系统的某些部分处理错误。其他部分则不在本地(局部)处理错误,而只是简单地报告说有错误发生,并信任调用链上游的某个子程序会处理该错误 - 调用错误处理子程序或对象
把错误处理都集中在一个全局的错误处理子程序或对象中。这种方法的优点在于能把错误处理的职责集中到一起,从而让调试工作更为简单。而代价则是整个程序都要知道这个集中点并与之紧密耦合。 - 当错误发生时显示出错消息
- 用最妥当的方式在局部处理技术
- 关闭程序
有些程序一旦检测到错误就立刻关闭。这一方法适用于人身安全攸关的应用程序。比如给癌症患者用的。
四、异常
异常是把代码中的错误或异常事件传递给调用方代码的一种特殊手段。如果一个子程序中遇到了预料之外的情况,但不知道该如何处理的话,它就可以抛出一个异常。