错误处理
更新时间:2024-07-05
概述
工作流在执行过程中,可能会因为各种原因出错导致执行失败。目前,operation、foreach、parallel 三类节点支持定义错误重试与错误捕获。
错误重试(retry)
错误重试,指在节点执行出错时进行多次重试。retry
字段负责错误重试的定义,它的值是一个包含若干重试策略的数组,每个重试策略包含了它所匹配的错误码,错误码命中时策略生效,并不再去匹配其它策略。具体字段如下:
字段 | 类型 | 描述 |
---|---|---|
errors(必需) | array of string | 策略所匹配的错误码集合 |
intervalSeconds(可选) | integer | 第一次重试之前等待的秒数(默认值为1) |
maxIntervalSeconds(可选) | integer | 最大重试等待时间(默认值为10) |
maxAttempts(可选) | integer | 重试的最大次数(默认值为2),如果错误发生次数超过指定值,则停止重试 |
multiplier(可选) | integer | 重试时间间隔倍数(默认值为2) |
错误捕获(catch)
如果工作流发生错误的节点没有定义 retry,或者 retry 没命中错误码,或者 retry 已超过重试最大次数,工作流会查看该节点是否定义了错误捕获 catch。catch 与 retry 类似,它的值是一个包含若干捕获策略的数组,每个捕获策略同样包含了它所匹配的错误码。如果定义了 retry 并且命中捕获策略,那就会按照策略跳转到其它节点执行。具体字段如下:
字段 | 类型 | 描述 |
---|---|---|
errors(必需) | array of string | 策略所匹配的错误码集合 |
next(必需) | string | 捕获错误后,要执行的下一个节点。下一个节点需要在同一个分支和层级,具体请看节点拓扑关系 |
示例
示例如下,retry
字段包含了两个重试策略,第一个策略匹配 CFC.InternalException 和 CFC.TooManyRequestsException 错误,第二个策略匹配任意错误。当两个重试策略未匹配到错误码,或已超过最大重试次数时,则不再重试。如果 catch
匹配到了错误码,那么就会执行 orderFailedHandler 这个节点。
YAML
1name: demo
2start: order
3states:
4 - type: operation
5 name: order
6 resource: brn:bce:cfc:bj:123456:function:order:$LATEST
7 end: true
8 retry:
9 - errors:
10 - CFC.InternalException
11 - CFC.TooManyRequestsException
12 intervalSeconds: 5
13 maxAttempts: 3
14 multiplier: 2
15 - errors:
16 - XFlow.ALL
17 intervalSeconds: 3
18 maxAttempts: 2
19 catch:
20 - errors:
21 - XFlow.RuntimeError
22 next: orderFailedHandler
23 - type: pass
24 name: orderFailedHandler
25 description: "handle order fail"
26 end: true
错误码
retry 和 catch 的策略依赖错误码匹配,相关的错误码如下。
工作流服务错误码:
错误码 | 描述 |
---|---|
XFlow.InternalError | 工作流服务内部错误 |
XFlow.RuntimeError | 节点执行过程中发生的错误,比如 switch 判断结果非 bool、输入输出数据非 JSON 等 |
XFlow.DataLimitExceeded | 节点的输入输出数据太大,目前限制为 250 KB |
XFlow.OperationFailed | 任务节点执行失败,一般为 CFC 函数代码执行时抛出异常或超时 |
XFlow.ALL | 匹配所有错误类型 |
公共错误码: 见 百度云公共错误码
CFC 错误码: 见 CFC 错误码