防御式编程

防御式编程的核心思想:子程序应该不因传入错误数据而被破坏,哪怕是有其他子程序产生的错误数据。更一般地说,其核心想法是要承认程序都会有问题,都需要被修改,聪明的程序员应该根据这一点来编程序。

通常有三种方法来保护程序免遭非法输入数据而被破坏

  • 检查所有来源于外部的数据的值
  • 检查子程序所有输入参数的值
  • 决定如何处理错误的输入数据

防御式编码的最佳方式就是在一开始不要在代码中引入错误。使用迭代式设计、编码前先写为代码、写代码前先写测试用例、低层设计检查等活动,都有助于防止引入错误。

断言

断言对于大型的复杂程序或可靠性要求极高的程序来说尤其有用。通过使用断言,能更快速的排查出音修改代码或者别的原因导致的程序错误。

一个断言通常含有两个参数:一个描述假设为真时的情况的布尔表达式和一个断言为假时需要显示的信息。

1
#define NSAssert(condition, desc)

断言主要是用于开发和维护阶段。通常,断言只是在开发阶段被编译到目标代码中,而在生成产品代码时并不编译进去。

使用断言的指导建议
用错处理代码来处理预期会发生的状况,用断言来处理绝不应该发生的状况。

错误处理通常用来检查有害的输入数据,而断言是用于检查代码中的bug。

有种方式可以让你更好地理解断言,那就是把断言看作是可执行的注解——你不能依赖它来让代码正常工作,但与编程语言中的注释相比,它能更主动地对程序中的假定做出说明。

避免把需要执行的代码放到断言中
用断言来注解并验证前条件和后条件

断言是用来说明前条件和后条件的有利工具,也可以用注释来说明前条件和后条件,但断言却能动态地判断前条件和后条件是否为真

对于高健壮性的代码,应该先使用断言再处理错误

错误处理技术

  • 返回中立值
  • 换用下一个正确的数据
  • 返回与前次相同的数据
  • 换用最接近的合法值
  • 把警告信息记录到日志文件中
  • 返回一个错误码
  • 调用错误处理子程序或对象
  • 当错误发生时显示出错消息
  • 用最妥当的方式在局部处理错误
  • 关闭程序 —— 这个方法适用于人身安全攸关的应用程序

健壮性与正确性

处理错误最恰当的方式要根据出现错误的软件的类别而定。正确性意味着永不返回不准确的结果,哪怕不返回结果也比返回不准确的结果好。然而,健壮性则意味着要不断尝试采取某些措施,以保证软件可以持续地运转下去,哪怕有时做出一些不够准确的结果。

异常

异常是把代码中的错误或异常事件传递给调用方代码的一种特殊方式。如果在一个子程序中遇到了预料之外的情况,但不知道该如何处理的话,它就可以抛出一个异常。对出错的前因后果不甚了解的代码,可以把控制权转交给系统中其他能更好地能更好地解释错误并采取措施的部分。