在撰写程序的时候,错误处理是一件很重要的事情。在「C++编程规范」这本书的第71个条款里,依照不同的错误处理结果,定义出三种「安全保证」等级: No-fail保证、Strong保证、Basic保证。这三种安全保证等级以执行方法遇到错误并且处理之后,是否会影响到数据或状态来做等级区分。开发人员在撰写每个方法之前,先决定方法的错误处理是属于哪个等级,可以减少思考的范围、避免一些不必要的过度设计。
No-fail保证
所谓的「No-fail保证」是说:执行方法一定成功、不会发生异常。在系统里有些方法,必须设计为提供No-fail保证等级,例如:解构子、资源释放、Log纪录…等等。这些方法通常会在错误处理时使用,如果错误处理时又会出错,那应该就是开发人员的灾难了。
以开发人员的角度来说,会希望所有方法都是No-fail保证等级。不过很残酷的现实是,大多数的方法都会发生异常、需要错误处理。
Strong保证
所谓的「Strong保证」是说:执行方法不一定成功、但异常处理之后状态或数据不变。系统里最常见设计为提供Strong保证等级的方法,就是使用「交易功能」的数据库操作方法。当执行数据库操作方法发生异常的时候,系统会Rollback数据库,让数据库维持呼叫方法之前的状态。
以开发人员的角度来说,应该要尽量设计方法到达Strong保证等级。方法执行的结果,要不就是正常执行完毕、要不就是发生异常可是数据或状态不变。
Basic保证
所谓的「Basic保证」是说:执行方法不一定成功、但异常处理之后的状态或数据是在「可接受范围」里。这边的可接受范围是指数据或状态的正确性,例如说:一台轿车最多只能坐五个人,结果执行方法发生异常后,在数据库里留下了六个人的纪录,这就是数据不在可接受范围里。
以开发人员的角度来说,Basic保证等级是方法必须满足的最低等级。当方法执行发生异常,可是异常处理之后的状态或数据不在可接受范围里,这样的执行结果应该归类为程序的Bug,必须要重新设计。因为方法执行发生异常之后,如果数据或状态无法保证在可接受范围里,那只会引发蝴蝶效应产生更多的错误。