错误处理体系 · 三件套
第 4 章 · 第 5 节
到目前为止,你的所有 workflow 都是”happy path”——节点跑挂了?整条流程戛然而止。但真实生产永远有意外:API 超时、字段缺失、网络抖动。这一节讲 n8n 的三件套——单节点容错 + 工作流级捕获 + 全局兜底。
🛡 error-trio.txt
三件套:
① Continue On Fail (节点级 · 单点容错)
"这个节点挂了,让下游照样跑"
② Error Trigger + 错误分支 (workflow 级 · 抓到错误另起一条线)
"整个工作流挂了,启动错误处理工作流"
③ Error Workflow(全局) (账户级 · 兜底通知)
"任何 workflow 挂了,都触发统一的告警流程"
每一层职责不同。生产级工作流通常三个都要配。
① Continue On Fail(节点级)
Section titled “① Continue On Fail(节点级)”打开任一节点 → Settings tab → 找到 “Continue On Fail” → 打开。
🚧 continue-on-fail.txt
默认行为:
[HTTP Request] 挂了 → 整个 workflow 停止
开了 Continue On Fail 后:
[HTTP Request] 挂了 → 该节点输出一个 error item → 下游继续跑
error item 长这样:
{ "error": { "message": "Request timeout", ... } }
下游可以用 IF 节点判断 {{ $json.error }} 是否存在来分流:
🚧 error-branching.txt
[HTTP Request (Continue On Fail)] → [IF ($json.error exists?)]
├── True ──→ [Log Error]
└── False ─→ [Process Success]
何时用: 单个节点失败你不希望整流程挂(如批量处理 100 个 user,1 个挂掉不影响另 99 个)。
② Error Trigger + 错误分支
Section titled “② Error Trigger + 错误分支”这是更强的方式——一个独立的触发器节点,专门接住失败事件。
🪤 error-trigger-setup.txt
1. 在主 workflow 里:
Settings → Error workflow → 选 "this workflow"(或另一个 workflow)
2. 在同一画布上加一个节点 "Error Trigger"
它不接任何上游 —— 仅在主流程挂掉时被激活
3. Error Trigger 输出包含:
- $json.execution (失败的 execution 信息)
- $json.workflow (workflow 元信息)
- $json.execution.error (错误对象)
4. 后接 Slack / Email / 自定义错误日志节点 —— 通知或记录
🪤 error-trigger-flow.txt
正常路径(同一画布):
[Webhook] → [Process] → [Save to DB] → [Notify]
错误路径(同一画布,独立的入口):
[Error Trigger] → [Format Error] → [Send to Slack #alerts]
↑
自动 "失败时启动"
何时用: 你想知道任何节点挂了都收到通知(不只是某一个特定节点)。
③ Error Workflow(全局兜底)
Section titled “③ Error Workflow(全局兜底)”让所有 workflow 挂掉时,都触发一个统一的”全局错误处理 workflow”——比如统一发到 Slack 的 #alerts 频道。
🌐 global-error-wf.txt
1. 建一个专门的 workflow,比如叫 "Global Error Handler"
入口节点 = Error Trigger
后续:格式化错误信息 → Slack / Email / PagerDuty 通知
2. 去其他每个 workflow 的 Settings → Error workflow:
选 "Global Error Handler"
3. 任何一个 workflow 挂掉时,都会自动触发 Global Error Handler,
传入 $json.workflow 让你知道是哪个 workflow 挂的。
一份”通用错误格式化” workflow 长这样
Section titled “一份”通用错误格式化” workflow 长这样” 🌐 error-handler-recipe.txt
[Error Trigger]
↓
[Set] 字段:
workflow_name = {{ $json.workflow.name }}
workflow_url = https://your-n8n.com/workflow/{{ $json.workflow.id }}
error_msg = {{ $json.execution.error.message }}
failed_node = {{ $json.execution.error.node.name }}
↓
[Slack #alerts]
Channel: #alerts
Message: 🚨 *{{ $json.workflow_name }}* failed
Node: {{ $json.failed_node }}
Error: {{ $json.error_msg }}
<{{ $json.workflow_url }}|Open in editor>
一些进阶模式
Section titled “一些进阶模式”Stop and Error(主动制造错误)
Section titled “Stop and Error(主动制造错误)”有时你想”判断不合法就主动让流程挂掉”。用 Stop and Error 节点:
🛑 stop-and-error.txt
[Webhook] → [IF (data is valid?)] ─ False ─→ [Stop and Error]
Error Message: "Invalid request: {{ $json.reason }}"
这会让整个 Execution 状态变 error,并触发 Error Workflow(如果配了)。
Retry On Fail(节点级重试)
Section titled “Retry On Fail(节点级重试)”节点 → Settings → “Retry On Fail” → 开 → 设置 Retries 次数和间隔。
🔁 retry-on-fail.txt
HTTP Request:
Retry On Fail: true
Max Tries: 3
Wait Between: 2 seconds (with jitter)
节点挂了会自动重试 2 次(共 3 次尝试)。常用于网络抖动场景。
Wait on Errors(暂停 vs 失败)
Section titled “Wait on Errors(暂停 vs 失败)”某些节点(如 Wait 节点)可以配 “On Error” 行为:
- Stop Workflow(默认)
- Continue (using error output) —— 继续,但用 error 数据
- Continue Workflow —— 继续,且不当错误
错误处理决策树
Section titled “错误处理决策树” 🌳 error-decision.txt
Q: 这个节点挂了,我希望什么发生?
[整流程立刻停下] ────────→ 默认行为(什么都不配)
[这一步挂没关系,下游照跑] ──→ 节点 Settings → Continue On Fail
[挂了想暗中重试几次] ─────→ 节点 Settings → Retry On Fail
[整流程挂了我要被通知] ────→ 工作流 Settings → Error workflow
+ 一个全局 Error Trigger workflow
[判断不通过我要主动挂] ────→ 加一个 Stop and Error 节点
本节要点回顾
Section titled “本节要点回顾”- 三件套:Continue On Fail(节点级)→ Error Trigger(workflow 级)→ Error Workflow(全局)
- 生产 workflow 至少应配 Error Workflow 兜底
- Stop and Error 节点:主动制造错误
- Retry On Fail:自动重试网络抖动
- n8n 默认不主动告警,必须自己配
下一节Sub-workflow 模块化——把常用逻辑抽成”函数”。