Saga / 補償回溯
有些自動化橫跨數個看似不可逆的步驟 —— 建立紀錄、寄送郵件、移動檔案。若後續步驟失敗,
已完成的步驟應被**復原**,但執行器的 AC_try 只對單一區塊做 try/catch/finally;沒有
任何機制追蹤跨 N 個已完成步驟「該復原什麼」。Saga 為每個步驟記錄一個補償動作,並在
任何失敗時以 LIFO 順序對已完成步驟執行補償。
前向動作與補償皆為純可呼叫物件(或經執行器以 JSON 動作清單),因此編排可在無任何真實副
作用下完整單元測試。補償為盡力而為:失敗的補償會被記錄,回溯繼續進行。不匯入
PySide6。
無頭 API
from je_auto_control import Saga
result = (Saga()
.step("create", create_record, delete_record)
.step("notify", send_email, None) # 無需復原
.step("move", move_file, restore_file)
.run())
if not result.ok:
result.failed_step # 哪個步驟拋出例外
result.completed # 前向執行過的步驟
result.compensated # 已復原的步驟(對已完成者 LIFO)
run() 回傳 SagaResult``(``ok / completed / compensated /
failed_step / error)。步驟「失敗」即其動作拋出例外;沒有補償的步驟在回溯時直接略
過。
執行器指令
AC_run_saga 接受 steps —— 一個 {name, action: [...], compensation: [...]}
的清單(或 JSON 字串),其中 action / compensation 各為一個 AutoControl 動作清單。
回傳 {ok, completed, compensated, failed_step, error}。相同操作亦提供為 MCP 工具
ac_run_saga,以及 Script Builder 中 Flow 分類下的指令。