错误处理技术

来源:互联网 发布:中国医药化工网数据库 编辑:程序博客网 时间:2024/06/04 00:56

断言可以用于处理代码中不应发生的错误。那又改如何处理那些预料中可能要发生的错误呢?

  1. 返回中立值。异常发生时继续执行操作并简单地返回一个没有危害的数值。比如,数值可以返回 0,字符串操作可以返回空字串,指针操作可以返回一个空指针,等等。
  2. 换用下一个正确的数据。如果在读取数据库记录并发现其中一条记录已经损坏时,你可以继续下去直到又找到一条正确的记录为止。比如读取体温计数据。
  3. 返回与前次相同的数据。
  4. 换用最接近的合法值。
  5. 把警告信息记录到日志文件中。在检测到错误数据的时候,可以选择在日志文件中记录一条警告信息,然后继续执行。这种方法可以同其他的错误处理技术结合使用。如果你用到了日志文件,要考虑是否能安全地公开它,或是否需要对其进行加密或施加其他方式的保护。
  6. 返回一个错误码。你可以决定只让系统的某些部分处理错误,其他部分则不在本地(局部)处理错误,而只是简单地报告说有错误发生,并信任调用链上游的某个字程序会处理该错误。你可以:1. 设置一个状态变量的值; 2. 用状态值作为函数的返回值; 3. 用语言内建的异常机制抛出一个异常;
  7. 调用错误处理子程序或对象。把所有的错误处理都集中在一个全局的错误处理子程序或对象中。优点在于能把错误处理的职责集中到一起,从而让调试工作更为简单。而代价则是整个程序都要知道这个集中点并与之紧密耦合。
  8. 当错误发生时显示出错消息。可以把错误处理的开销削减到最少,然而会增加不安全因素,错误信息有可能会被攻击者利用。
  9. 用最妥当的方式在局部处理错误。这种方法给予每个程序员很大的灵活度,但也带来显著的风险,及系统的整体性能将无法满足对其正确性或可靠性的需求。根据开发人员最终用以处理特定错误的方法不同,这样做也有可能烤制与用户界面相关的代码散步到整个系统中,从而又使程序面临那些鱼显示出错误消息相关的问题。
  10. 关闭程序。这一方法适用于人身安全攸关的应用程序。

正确性与健壮性

正确性意味着永远不返回不准确的结果,哪怕不返回也比返回不准确的结果好。然而,健壮性则意味着要不断尝试采取某些措施,以保证软件可以持续地运转下去,哪怕有时会做出一些不够准确的结果。

错误处理最恰当的方式要根据出现错误的软件的类别而定。有时更侧重于正确性,而有时更侧重于健壮性。

人身安全攸关的软件往往更倾向于正确性而非健壮性,消费类软件往往更注重健壮性。

高层次设计对错误处理方式的影响

既然有这么多的选择,你就必须注意到,应该在整个程序里采用一致的方式处理异常。对错误进行处理的方式会直接关系到软件是否能满足在正确性,健壮性和其它非功能性指标的要求。确定一种处理方法,是架构层次的设计决策,需要在那里的某个层次上解决。

隔离程序,使之包容由错误造成的损害

以防御式编程为目的而进行隔离的一种方法,是把某些接口选定为 “安全” 区域的边界。对穿越安全区域边界的数据进行合法性校验,并当数据非法时做出敏锐的反应。

数据由图形用户界面,命令行界面,实时数据界面,外部文件,其他外部对象引进,假设这些数据是肮脏且不可信的。由数据验证类1,数据验证类2,数据验证类3...负责清理数据,它们构成了隔栏。再内部类1,内部类2,内部类3...可以假定数据都是干净且可信的,处理这些数据而无须再担负检查错误数据的职责。

也同样可以在类的层次采用这种方法。类的公用方法可以假定数据是不安全的,它们要负责检查数据并进行清理。一旦类的公用方法接受了数据。那么类的私用方法就可以假定数据都是安全的了。