错误处理

本文介绍错误处理的基本概念和相关使用示例,通过重试机制及捕获策略,帮助您轻松应对常见错误,提升流程稳定性。

基本概念

云工作流集成可能会产生一些预期或者非预期的错误,您可针对该场景选择继续进行该状态的操作,或直接引导至下一个状态。关键字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.ResourceThrottled:您的函数因为并发度过高被限流。您所有的函数由一个总的并发度控制。云工作流执行到任务类型节点时会同步调用函数计算,此数值与其他调用方式的并发度共用。您可以申请调整该值。

  • FC.ResourceExhausted:您的函数因为资源不足被限流。当出现这类错误时,请联系我们

  • FC.InternalServerError:函数计算出现系统错误,请重新执行流程。

说明

{Error code}是函数计算的错误码。详细信息,请参见错误码列表

FC.Unknown

函数计算服务调用函数成功,但函数执行出错,且该错误码未被捕获,例如UnhandledInvocationError等。

{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”集成调用产生错误,且命中 MyCustomException2MyCustomException3,则依照策略最大重试3次,初始重试间隔时间是5秒,按照每次退避2.0的速率,会按照 [5, 10, 20, 40] 的间隔时间进行重试,重试次数3次耗尽后,当前错误会命中MyCustomException2MyCustomException3的错误捕获规则,通过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的错误重试和错误捕获,当发生除MyCustomException1MyCustomException2MyCustomException3外的其它任何错误时,都会首先进行重试,依照策略最大重试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