以 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 )
有什么更好的模式吗?
![]() | 1 K1W1 2020-11-05 18:22:53 +08:00 via Android goto ? |
2 ningmengmao 2020-11-05 18:28:48 +08:00 via Android 用职责链模式试试? |
![]() | 3 SethShi 2020-11-05 18:55:13 +08:00 via Android 用一个数组包装所有函数 执行失败数组指针回滚一位 回滚了两次直接跳出数组循环 |
![]() | 写个接口,包括操作和回滚方法,分别实现然后放到数组里... |
![]() | 5 jinhan13789991 2020-11-05 20:01:11 +08:00 via Android 设计模式在备忘录模式 |