错误:系统本身不符合设计期望的行为或者状态。
产生错误的原因有三:需求所依赖的假定不能成立、设计没有匹配需求、设计所依赖的假定不能成立、实现没有匹配设计。 表现为需求错误、需求遗漏、逻辑错误、内存读写错误、关键计算资源计算错误等等。
软件自身能够检测到错误的原因是下一步的正确运行总是建立在上一步能够被成功执行的前提之上。如果我们在软件中设立一些检测点,对前提进行测试,则软件就有可能自己发现错误。比如pre-condition和post-condition以及不变式就是重要的运行前提。
按照对系统状态一致性的影响,错误可以划分为两类:
a)错误发生后不影响系统状态,比如没有内部状态的计算函数中的错误
b)错误发生后影响系统状态,比如修改存储数据过程中发生的错误
b类错误由于对系统状态的影响,通常导致系统的后续行为难以预料,相比a类危害更大。
另外,对于b类错误,我们可以使用下面的技术来降低错误的影响:
a)采用地址空间隔离等技术来缩小状态被影响的范围。
b)重启整个系统或者特定的子系统,消除偶发错误在系统中留下的遗迹,以避免随后有这些遗迹导致的派生错误。
另外错误虽然不能自愈,只有透过修改系统来解决,但是错误的触发是有条件的,这就启发我们可以在检测到错误后关闭会触发错误的服务,将系统降级运行。
异常:外部环境的不同寻常的行为或者状态。
这种不同寻常的行为或者状态导致系统正常提供服务的前提得不到满足,导致无法完成期望的功能。比如操作员没有按正常的流程输入操作指令,来自网络的错误报文,协议报文丢失等等。
异常是系统必须要处理的事件和状态,通常作为非功能性需求的一部分被编档。如果在需求阶段异常用例被遗漏,就会产生一个设计不匹配真实需求的错误。
在定义和设计系统时就应该规划好异常的应对方案,系统应该有确定的异常响应方式,比如系统的内部一致性不能因异常条件而被破坏,在异常条件消失后,系统应能正常提供服务。