可视化工作流/错误处理、重试与补偿机制
5.12 错误处理、重试与补偿机制(Error Handling, Retry & Compensation)
在构建工作流时,错误处理是确保流程稳定运行的关键环节。Pop 工作流内置了多层级的错误捕获、自动重试与补偿机制,使开发者能够从容应对:
- 第三方接口波动
- AI 模型超时 / 限流
- 文件 I/O 问题
- 用户输入错误
- PSL 脚本异常
- 业务逻辑不满足条件导致的中断
本章将介绍 Pop 中所有与错误处理相关的功能与技巧。
🔍 一、工作流中的错误类型
工作流执行期间可能出现以下错误类型:
| 错误类型 | 说明 | 常见场景 |
|---|---|---|
| 配置错误(Config Error) | 节点配置缺失或字段不合法 | 未填写模型 / URL / 必填项 |
| 输入错误(Input Error) | 上游节点传入的数据格式错误 | 字段为空、类型不匹配 |
| 脚本错误(PSL Error) | PSL 执行时出现异常 | 未检查 null、访问无效属性 |
| 运行时错误(Runtime Error) | 执行中发生外部异常 | HTTP 超时、文件不存在 |
| 业务逻辑错误(Business Error) | 用户自定义的失败条件 | 状态码不正确、返回内容不满足 |
Pop 运行日志会明确展示每个错误的类型、堆栈与位置,便于快速定位问题。
🔁 二、节点级自动重试(Retry)
许多节点支持 自动重试策略,用于应对偶发性问题(网络波动、AI 超时等)。
你可以在节点右侧属性中配置:
| 配置项 | 说明 |
|---|---|
| 重试次数(retryCount) | 默认 0,可设置 1–5 次 |
| 重试间隔(retryInterval) | 重试之间等待的毫秒数 |
| 重试条件(可选) | 仅对特定错误触发,例如 HTTP 500 |
适合用于:
- AI 调用超时
- HTTP 请求偶尔失败
- 文件读取延迟
- 网络波动导致的 I/O 错误
示例:
retryCount: 3
retryInterval: 1000
🛑 三、错误捕获(Try-Catch Node)
为了更细粒度的控制异常处理,你可以使用 Try / Catch 节点。
Try-Catch 的结构:
[Try Node]
↓ 错误时自动进入
[Catch Node]
用途:
- 捕获某节点或子流程的全部异常
- 在 Catch 中进行补偿
- 在 Catch 中发送告警(短信、邮箱、飞书、Webhook)
- 让流程不中断继续执行后续步骤
示例 Catch 输出数据结构:
{
"error": {
"message": "HTTP request failed",
"stack": "...",
"node": "http-request-2"
}
}
🔄 四、补偿节点(Compensation)
补偿机制用于:
在失败时执行一段逻辑,用于撤销、回滚或提示用户。
常见业务场景:
- 写数据库失败 → 回滚之前写入的缓存
- 调用第三方 API 失败 → 执行通知
- 文件移动失败 → 恢复原始文件位置
- 生成文档失败 → 删除中间文件
补偿节点通常由以下节点实现:
- 脚本节点(执行撤销逻辑)
- HTTP/Webhook(通知开发者)
- 文件节点(恢复文件状态)
- 自定义的撤销逻辑模块(Module)
示例补偿脚本:
globals.set("rollback", true);
return { status: "rolled_back" };
🧩 五、Fail-Safe 安全节点
某些场景你希望:
- 即使失败也不要中断流程
- 失败时使用默认值继续执行
可以使用:
Safe Node(安全执行)
它提供两个输出端:
成功 → success
失败 → fallback
适用于:
- AI 超时,使用“默认回答”
- HTTP 请求失败,使用“缓存内容”
- 文件读取失败,继续执行空值逻辑
示例:
fallbackValue: { "useCache": true }
🧪 六、PSL 中的错误处理
PSL 提供 try/catch 风格的写法:
try {
const data = nodes.sn(5).output.items;
return { ok: true, items: data };
} catch (e) {
return { ok: false, error: e.message };
}
你可以用此方式让脚本节点始终返回“安全的结构”,避免中断整个工作流。
🧭 七、错误定位与调试技巧
✔ 1. 查看红色节点日志
错误节点边框会变红。
展开运行日志即可查看堆栈。
✔ 2. 使用右键「运行此节点」
逐节点排查最有效方式。
✔ 3. 使用“字典节点”打印调试值
例如:
{
"debug_input": {{input.first}},
"node_output": {{nodes.sn(8).output}}
}
✔ 4. 使用分支节点提前阻断异常
例如:
- 当字段为空 → 走 error 分支
- 状态码不正确 → 走 fallback 分支
🧱 八、健壮性设计最佳实践
| 建议 | 说明 |
|---|---|
| 设置必要的默认值 | 避免 null 引起脚本报错 |
| 对所有外部接口设置重试 | AI / HTTP / 文件网络操作 |
| 使用 Try-Catch 节点隔离风险 | 局部失败不影响全局流程 |
| 对大任务拆分模块 | 便于调试、复用、隔离错误 |
| 使用 modules 实现幂等逻辑 | 防止重复运行引起问题 |
| 记录错误到日志中心 | 用于后续排查 |
🎯 九、小结
Pop 的错误处理体系覆盖:
- 自动重试
- Try/Catch 流程化捕获
- 补偿逻辑
- PSL 脚本异常控制
- Fail-Safe 安全执行
- 柔性分支与默认值
- 完整可追踪的执行日志
掌握这些能力,将帮助你构建更可靠、更稳定、更可维护的自动化流程系统。