如果一段代码流程里有很多顺序操作,在某个步骤失败的时候,需要回退之前的操作,怎么写优雅呢?
資深大佬 : rrfeng 4
以 golang 为例:
func do() { err := step1() if err != nil { return err} err = step2() if err != nil { rollback_err = undo_step1(); if rollback_err != nil { return err } } }
这样写的缺点是,步数越多后面越复杂。
尝试每个步骤后使用 defer 注册 rollback,带来的问题是无法直接跳出 defer 栈: 比如 step3 错误,undo_step2() 也要进行错误处理,如果也错误,那应该直接返回错误而不是继续执行 undo_step1 (在 step1 之后注册的 defer )
有什么更好的模式吗?
大佬有話說 (5)