一、错误处理技术
-
返回中立值
比如,数值返回0,空指针返回NULL等
-
换用下一个正确数据
如果每秒100次读取体温计数据,那么某一次数据有误,只需再等上1/100秒即可
-
返回与前次相同的数据
温度在1/100秒内一般不会发生变化,可以简单返回上一次的数据 -
换用最近的合法值
温度计已经校准在0-100°C,如果某一次检测到小于0的结果,那么可以把它替换为0,即最接近的那个合法值;如果大于100,则替换为100。如果发现某个字符串的长度小于0,也可以使用0替代。比如倒车时,速度表盘无法显示负值速度,所以只是简单显示为0,即最接近的那个合法值 -
把警告信息写到日志中
在日志中记录或打印一条警告信息,然后继续执行。此方法可以同其他错误处理技术结合使用,比如换用最接近的合法值,换用下一个正确的值。 -
返回一个错误码
你可以决定只让系统的某些部分处理错误。其他部分则不在本地(局部)处理错误,而只是简单地报告说有错误发生,并信任调用链上游的某个子程序会处理该错误。通知系统其余部分已经发生错误可以采用下列方法之一:
1、设置一个状态变量的值
2、用状态值作为函数的返回值
3、用语言内建的异常机制抛出一个异常
在这种情况下,与确定特定的错误报告机制相比,更为重要的是要决定系统里的哪些部分应该直接处理错误,哪些部分知识报告所发生的错误。如果安全性很重要,请确认调用方的子程序总会检查返回的错误码。 -
调用错误处理子程序或对象
把错误处理都集中在一个全局的错误处理子程序或对象中。 -
当错误发生时显示出错消息
在用户界面弹出错误消息,当心不要告诉系统的潜在攻击者太多东西。攻击者有时能利用错误信息来发现如何攻击这个系统。 -
用最妥当的方式在局部处理错误
在局部解决所有遇到的错误 -
关闭程序
一旦检测到错误发生就会关闭,比如用作控制治疗癌症病人的放疗设备的软件接收到了错误的放射剂量输入数据,那么怎么处理这一错误最好呢?应该使用与上一次相同的数值吗?应该用最接近的合法值吗?应该使用中立值吗?在这种情况下,关闭程序是最佳的选择。哪怕重启机器也比毛线施放错误的放射剂量要好得多。
二、健壮性与正确性
- 正确性
正确性意味着永不返回不准确的结果,哪怕不反悔结果也比返回不准确的结果好。人身安全攸关的软件往往更倾向于正确性而非健壮性。不返回结果也比返回错误的结果好。放射线治疗仪就是体现这一原则的好例子 - 健壮性
健壮性意味着要不断尝试采取某些措施,以保证软件可以持续地运转下去,哪怕有时做出一些不够准确的结果。消费类应用软件往往更注重健壮性而非正确性。通常只要返回一些结果就比软件停止运行强。
三、高层次设计对错误处理方式的影响
1、既然有这么多的选择,你就必须注意,应该在整个程序里采用一致的方式处理非法的参数。对错误进行处理的方式会直接关系到软件能否满足在正确性、健壮性和其他非功能性指标方面的要求。确定一种通用的处理错误参数的方法,是架构层次(或称高层次)的设计决策,需要在那里的某个层次上解决
2、一旦确定了某种方法,就要确保始终如一地贯彻这一方法。如果你决定让高层的代码来处理错误,而底层的代码只需简单地报告错误,那么就要确保高层的代码真的处理了错误!有些语言允许你忽略“函数返回的是错误码”这一事实——在C++中,你无需对函数的返回值做任何处理,但千万不要忽略错误信息!检查函数的返回值。即使你认定某个函数绝对不会出错,也无论如何要去检查一下。防御式编程全部的重点就在于防御哪些你未曾预料到的错误。这些指导性建议对于系统函数和你自己写的函数都是成立的,请在每个系统调用后检查错误码。一旦检测到错误,就记下错误代号和它的描述信息。