错误处理
更新时间: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 这个节点。
name: demo
start: order
states:
- type: operation
name: order
resource: brn:bce:cfc:bj:123456:function:order:$LATEST
end: true
retry:
- errors:
- CFC.InternalException
- CFC.TooManyRequestsException
intervalSeconds: 5
maxAttempts: 3
multiplier: 2
- errors:
- XFlow.ALL
intervalSeconds: 3
maxAttempts: 2
catch:
- errors:
- XFlow.RuntimeError
next: orderFailedHandler
- type: pass
name: orderFailedHandler
description: "handle order fail"
end: true
错误码
retry 和 catch 的策略依赖错误码匹配,相关的错误码如下。
工作流服务错误码:
错误码 | 描述 |
---|---|
XFlow.InternalError | 工作流服务内部错误 |
XFlow.RuntimeError | 节点执行过程中发生的错误,比如 switch 判断结果非 bool、输入输出数据非 JSON 等 |
XFlow.DataLimitExceeded | 节点的输入输出数据太大,目前限制为 250 KB |
XFlow.OperationFailed | 任务节点执行失败,一般为 CFC 函数代码执行时抛出异常或超时 |
XFlow.ALL | 匹配所有错误类型 |
公共错误码: 见 百度云公共错误码
CFC 错误码: 见 CFC 错误码