本文介绍错误处理的基本概念和相关使用示例,通过重试机制及捕获策略,帮助您轻松应对常见错误,提升流程稳定性。
基本概念
云工作流集成可能会产生一些预期或者非预期的错误,您可针对该场景选择继续进行该状态的操作,或直接引导至下一个状态。关键字FnF.ALL
为特殊选项,该选项能够捕捉所有错误。工作流错误处理包含两部分内容:错误重试(Retry),错误捕获(Catch)。
支持错误处理的状态类型
针对下面的状态类型,状态定义中支持Retry和Catch两个字段,分别用于声明错误重试和错误捕获的策略,帮助处理状态中发生的错误。
在具体的错误处理中,总是按照先执行Retry策略,如果Retry失败,再执行Catch策略的顺序进行错误处理。
错误重试(Retry)
字段 | 类型 | 是否必选 | 描述 | 示例值 |
Errors | []string | 是 | 可以命中的错误列表,请参考常见错误类型。 | -MyCustomError -FnF.ALL |
Description | string | 是 | 控制台中的策略名称,也是对错误重试的描述。 | 重试策略 #1 |
MaxAttempts | int | 是 | 表示最大重试次数。 | 3 |
IntervalSeconds | int | 是 | 表示重试间隔时间,最大值是86400秒。单位:秒。 | 10 |
BackoffRate | float | 否 | 表示下一次重试间隔时间是当前重试间隔时间的倍数。 | 2 |
MaxBackoffSeconds | int | 否 | 表示运行的最大重试间隔时间,最大值是86400秒。单位:秒。 | 30 |
错误重试规则中,如果用户针对同一个错误类型定义了多个重试规则,在实际的错误重试中只会优先按照匹配到的第一个规则进行错误重试。
错误捕获(Catch)
字段 | 类型 | 是否必选 | 描述 | 示例值 |
Errors | []string | 是 | 可以命中的错误列表,请参考常见错误类型。 | -MyCustomError -FnF.ALL |
Description | string | 是 | 控制台中的策略名称,也是对错误捕获的描述。 | 错误捕获规则 #1 |
OutputConstructor | map[string]any | 否 | 输出构造器,与Next搭配使用。 | 请参见输出构造器 |
Next | string | 是 | 捕获到指定错误时,回退的状态。 | my-next-state |
OutputConstructor与Next搭配使用,在流转至其他状态的场景下,本身没有产生符合预期的输出,即使流转到下一个状态也无法处理,因此,此处使用OutputConstructor可以直接构造一个输出,作为跳转到目标状态的输入。
错误/异常捕获规则中,如果用户针对同一个错误类型定义了多个错误捕获规则,在实际的错误处理中只会优先按照匹配到的第一个规则进行捕获处理。
常见错误类型
当前常见错误类型主要以函数计算集成为示例,其它集成服务相关的错误类型请参考对应的集成文档说明。
错误类型 | 描述 | |||
FC.{ErrorCode} | 函数计算服务返回除200的HTTP Code。常见的错误类型如下所示:
说明
| |||
FC.Unknown | 函数计算服务调用函数成功,但函数执行出错,且该错误码未被捕获,例如 | |||
{CustomError} | 被调用方主动抛出的自定义异常错误,例如函数内部业务错误,云工作流内部业务错误。 | |||
FnF.TaskTimeout | 云工作流某步骤执行超时。 | |||
FnF.Timeout | 云工作流整体执行超时。 | |||
FnF.ALL | 捕获云工作流系统的所有错误。 |
常见错误处理示例
基础错误重试
本示例中如果“my-error-handle-example”集成调用产生错误,且命中MyCustomException1
,则依照策略最大重试3次,每次重试次数3次耗尽后,当前错误会命中MyCustomException1
的错误捕获规则,通过OutputConstructor构造一个自定义的错误输出,作为输入流转至ErrorCatchExit
状态。
Type: StateMachine
Name: ErrorHandleExample
SpecVersion: v1
Description: 基础错误处理示范
StartAt: my-error-handle-example
States:
- Type: Task
Name: my-error-handle-example
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:{regionId}:{accountId}:functions/myfunction/LATEST
invocationType: Sync
body: |
xxx
Retry:
- Errors:
- MyCustomException1
Description: 重试策略1
MaxAttempts: 3
IntervalSeconds: 2
Catch:
- Errors:
- MyCustomException1
Description: 捕获策略1
OutputConstructor:
ErrorCode: MyCustomException1
ErrorMessage: MyCustomException1
Next: ErrorCatchExit
Next: SucceededExit
- Type: Pass
Name: ErrorCatchExit
End: true
- Type: Pass
Name: SucceededExit
End: true
在保存前必须验证resourceArn的合法性:resourceArn:acs:fc:{regionId}:{accountId}:functions/myfunction/LATEST中的resourceArn示例应替换为您实际的函数ARN。获取函数ARN的方法,请参见创建事件函数。
regionId:应为您函数所在的阿里云地域,例如"cn-beijing"或"cn-hangzhou"。
accountId:应为您的阿里云账号(主账号)ID。
myfunction:应为您的实际函数名称。
LATEST:表示使用最新版本的函数,您可以根据需要指定具体的版本或别名。
MyCustomException1:您可根据业务的需求,修改成符合您需要的错误信息。
退避错误重试
本示例中如果“my-error-handle-example”集成调用产生错误,且命中 MyCustomException2
或 MyCustomException3
,则依照策略最大重试3次,初始重试间隔时间是5秒,按照每次退避2.0的速率,会按照 [5, 10, 20, 40] 的间隔时间进行重试,重试次数3次耗尽后,当前错误会命中MyCustomException2
或MyCustomException3
的错误捕获规则,通过OutputConstructor构造一个自定义的错误输出,作为输入流转至ErrorCatchExit
状态。
Type: StateMachine
Name: ErrorHandleExample
SpecVersion: v1
Description: '退避错误处理示范'
StartAt: my-error-handle-example
States:
- Type: Task
Name: my-error-handle-example
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:{regionId}:{accountId}:functions/myfunction/LATEST
body: xxx
Retry:
- Errors:
- MyCustomException2
- MyCustomException3
Description: 重试策略2
MaxAttempts: 3
IntervalSeconds: 5
BackoffRate: 2.0
Catch:
- Errors:
- MyCustomException2
- MyCustomException3
Description: 捕获策略2
Next: ErrorCatchExit
Next: SucceededExit
- Type: Pass
Name: ErrorCatchExit
End: true
- Type: Pass
Name: SucceededExit
End: true
复杂重试策略
本示例中如果“my-error-handle-example”集成调用产生错误,通过声明针对FnF.ALL
的错误重试和错误捕获,当发生除MyCustomException1
,MyCustomException2
,MyCustomException3
外的其它任何错误时,都会首先进行重试,依照策略最大重试3次,初始重试间隔时间是5秒,按照每次退避2.0的速率,由于设置了最大退避重试间隔时间,由于最后一次退避间隔时间40s大于了设置的最大退避重试间隔时间30s,所以实际会按照 [5, 10, 20, 30] 的间隔时间进行重试,重试次数3次耗尽后,会命中FnF.ALL
的错误捕获规则,由于没有自定义的OutputConstructor构造, 默认流转至ErrorCatchExit
状态。
Type: StateMachine
Name: ErrorHandleExample
SpecVersion: v1
Description: '错误处理示范'
StartAt: my-error-handle-example
States:
- Type: Task
Name: my-error-handle-example
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:{regionId}:{accountId}:functions/myfunction/LATEST
body: xxx
Retry:
- Errors:
- MyCustomException1
Description: 重试策略1
MaxAttempts: 3
IntervalSeconds: 2
- Errors:
- MyCustomException2
- MyCustomException3
Description: 重试策略2
MaxAttempts: 3
IntervalSeconds: 5
BackoffRate: 2.0
- Errors:
- FnF.ALL
Description: 重试策略2
MaxAttempts: 3
IntervalSeconds: 5
BackoffRate: 2.0
MaxBackoffSeconds: 30
Catch:
- Errors:
- MyCustomException1
Description: 捕获策略1
OutputConstructor:
ErrorCode: MyCustomException1
ErrorMessage: MyCustomException1
Next: ErrorCatchExit
- Errors:
- MyCustomException2
- MyCustomException3
Description: 捕获策略2
Next: ErrorCatchExit
- Errors:
- FnF.ALL
Description: 捕获策略3
Next: ErrorCatchExit
Next: SucceededExit
- Type: Pass
Name: ErrorCatchExit
End: true
- Type: Pass
Name: SucceededExit
End: true