跳转至

取消、超时与失败策略

GFCommandSequence 的取消和失败策略只控制序列执行状态。项目层仍需要定义业务副作用如何撤销、错误如何展示、日志如何记录,以及是否允许用户重试。

取消与超时

cancel() 会先通知当前步骤的 cancel(context) 钩子;普通对象步骤如果提供无参 cancel() 也会被调用。随后序列会停止当前等待、不再执行后续步骤,并发出 sequence_cancelled

Signal 等待默认有 30 秒超时。with_signal_timeout(seconds, respect_time_scale) 可配置等待上限,并默认跟随 GFTimeUtility 的暂停与 time_scale。超时只结束序列等待,不会回滚已经发生的外部副作用。

失败结果

步骤返回以下字典形态时,序列会判定失败:

  • {"ok": false, "error": "..."}
  • {"success": false}
  • {"status": "error"}
  • {"status": "failed"}
  • {"status": "failure"}

失败时序列会发出 step_failed,并把结果写入 last_run_report;失败步骤不会同时发出 step_completed。只 push_error() 或返回任意自定义对象不会自动被视为失败;项目层应把可判定失败的步骤收敛为这些结果字典。

停止与回滚

默认策略会继续执行后续步骤。开启 stop_on_error 后,序列在失败时停止;开启 rollback_on_failure 后,序列会逆序调用已完成步骤的 undo()

var sequence := GFCommandSequence.new([
    PrepareStep.new(),
    ApplyStep.new(),
    CommitStep.new(),
]).with_failure_policy(true, true)

await sequence.run()

if sequence.last_run_report.get("failed", false):
    push_warning(sequence.last_run_report.get("error", "Sequence failed."))

失败报告只描述流程执行状态,不解释错误业务含义。项目层可以把它接到日志、诊断面板、编辑器验证工具或自己的恢复流程。