一般而言,失败的方法调用应该使对象保持在被调用之前的状态。具有这种属性的方法被成为具有失败原子性(failure atomic)。
最简单的办法莫过于设计一个不可变的对象(见第15条)。 对于在可变对象上执行操作的方法,获得失败原子性最常见的方法是,在执行操作之前检查参数的有效性(见第38条)。
一种类似的获得失败原子性的办法是,调整计算处理过程的顺序,使得任何可能会失败的计算部分都在对象状态被修改之前发生。
第三种获得失败原子性的办法远远没有那么常用,用法是编写一段恢复代码(recovery code),由它来拦截操作过程中发生的失败,以及使对象会滚到操作开始之前的状态上。这种办法主要用于永久性的(基于磁盘的(disk-based)数据结构)。
最后一种获得失败原子性的办法是,在对象的一份临时拷贝上执行操作,当操作完成之后再用临时拷贝中的结果代替对象的内容。
错误(相对于异常)通常是不可恢复的,当方法抛出错误时,它们不需要努力保持失败原子性。
一般而言,作为方法规范的一部分,产生的任何异常都应该让对象保持在该方法调用之前的状态。如果违反这条规则,API文档就应该清楚地指明对象将会处于什么样的状态。