

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 Step Functions 状态机中处理错误条件
<a name="tutorial-handling-error-conditions"></a>

在本教程中，您将创建一个具有**任务 Amazon Step Functions **状态的状态机，该状态机调用为抛出自定义错误而构建的示例 Lambda 函数。

任务属于 [回退状态](concepts-error-handling.md#error-handling-fallback-states)，您可以为其配置 `Catch` 字段。当集成收到错误时，Catch 字段会根据错误名称选择后续步骤。

## 第 1 步：创建一个会引发错误的 Lambda 函数
<a name="create-lambda-function-fail"></a>

使用 Lambda 函数来模拟错误情形。

1. 打开 Amazon Lambda 控制台，网址为[https://console.aws.amazon.com/lambda/](https://console.amazonaws.cn/lambda/)。

1. 选择**创建函数**。

1. 选择**使用蓝图**，搜索 `Step Functions` 并选择**引发自定义错误**。

1. 对于**函数名称**，请输入 `ThrowErrorFunction`。

1. 对于**角色**，选择**创建具有基本 Lambda 权限的新角色**。

1. 选择**创建函数**。

   以下代码应显示在**代码**窗格中。

   ```
   export const handler = async () => {
       function CustomError(message) {
           this.name = 'CustomError';
           this.message = message;
       }
       CustomError.prototype = new Error();
   
       throw new CustomError('This is a custom error!');
   };
   ```

## 第 2 步：测试您的 Lambda 函数
<a name="error-conditions-test"></a>

创建状态机之前，请验证您的 Lambda 函数在调用时是否会引发 `CustomError`。

1. 选择**测试**选项卡。

1. 选择**创建新事件**并保留默认的**事件 JSON**

1. 选择**测试**以使用测试事件调用函数。

1. 展开**执行函数**以查看所引发错误的详细信息。

现在，您已准备好一个 Lambda 函数，可用来引发自定义错误。

在下一步中，您将设置一个状态机来捕获该错误并进行重试操作。

## 第 3 步：创建状态机
<a name="state-machine-create-step"></a>

通过 Step Functions 控制台创建使用 [Task 工作流程状态](state-task.md)（具有 `Catch` 配置）的状态机。状态机将调用 Lambda 函数，您构建该函数是为了模拟在调用该函数时引发错误。Step Functions 重试该函数，在两次重试之间使用指数回退。

1. 打开 [Step Functions 控制台](https://console.amazonaws.cn/states/home)，从菜单中选择**状态机**，然后选择**创建状态机**。

1. 选择 “**从空白处创建**”，然后在 “**状态机名称**” 中输入*CatchErrorStateMachine*。

1. 接受默认类型（标准），然后选择**继续**，以在 Workflow Studio 中编辑状态机。

1. 选择**代码**以切换到 ASL 编辑器，然后将代码替换为以下状态机定义：

   ```
   {
     "Comment": "Example state machine that can catch a custom error thrown by a function integration.",
     "StartAt": "CreateAccount",
     "States": {
       "CreateAccount": {
         "Type": "Task",
         "Resource": "arn:aws:states:::lambda:invoke",
         "Output": "{% $states.result.Payload %}",
         "Arguments": {
           "FunctionName": "arn:aws:lambda:region:account-id:function:ThrowErrorFunction:$LATEST",
           "Payload": "{% $states.input %}"
         },
         "Catch": [
           {
             "ErrorEquals": [
               "CustomError"
             ],
             "Next": "CustomErrorFallback"
           },
           {
             "ErrorEquals": [
               "States.ALL"
             ],
             "Next": "CatchAllFallback"
           }
         ],
         "End": true,
         "Retry": [
           {
             "ErrorEquals": [
               "CustomError",
               "Lambda.ServiceException",
               "Lambda.AWSLambdaException",
               "Lambda.SdkClientException",
               "Lambda.TooManyRequestsException"
             ],
             "IntervalSeconds": 1,
             "MaxAttempts": 3,
             "BackoffRate": 2,
             "JitterStrategy": "FULL"
           }
         ]
       },
       "CustomErrorFallback": {
         "Type": "Pass",
         "End": true,
         "Output": {
           "Result": "Fallback from a custom error function."
         }
       },
       "CatchAllFallback": {
         "Type": "Pass",
         "End": true,
         "Output": {
           "Result": "Fallback from all other error codes."
         }
       }
     },
     "QueryLanguage": "JSONata"
   }
   ```

## 第 4 步：配置状态机
<a name="state-machine-configure"></a>

运行状态机之前，必须先连接到之前创建的 Lambda 函数。

1. 切换回**设计**模式并选择名为的 **Lambda: 调用**任务状态。**CreateAccount**

1. 在**配置**选项卡上，查找 **API 参数**。对于**函数名称**，选择之前创建的 Lambda 函数。

1. 选择**创建**，查看角色，然后选择**确认**以创建您的状态机。

## 第 5 步：运行状态机
<a name="error-conditions-execution"></a>

创建并配置状态机之后，可以运行该状态机并检查流程。

1. 在编辑器中，选择**执行**。

   或者，从**状态机**列表中选择**启动执行**。

1. 在**启动执行**对话框中，接受生成的 ID，然后在**输入**中输入以下 JSON：

   ```
   { "Cause" : "Custom Function Error" }
   ```

1. 选择**启动执行**。

Step Functions 控制台会将您引导到一个以您的执行 ID 为标题的页面，即*执行详细信息*页面。您可以随着工作流的进展以及在工作流完成后查看执行结果。

要查看执行结果，请在**图表视图**上选择各个状态，然后在[步骤详细信息](concepts-view-execution-details.md#exec-details-intf-step-details)窗格中选择各个选项卡，分别查看每个状态的详细信息，包括输入、输出和定义。有关可在*执行详细信息*页面上查看的执行信息的详细信息，请参阅[执行详细信息概览](concepts-view-execution-details.md#exec-details-interface-overview)。

状态机将调用 Lambda 函数，从而引发 `CustomError`。在**图表视图中选择**CreateAccount**步骤以查看**状态输出。您的状态机输出应类似于下图：

![\[捕获自定义错误的工作流的说明性屏幕截图。\]](http://docs.amazonaws.cn/step-functions/latest/dg/images/tutorial-console-retry-state-machine-error-output.png)


**恭喜您！**

 您现在拥有可以捕获和处理 Lambda 函数引发的错误条件的状态机。您可以使用这种模式在工作流中实施强大的错误处理。

**注意**  
您还可以创建在超时情况下执行[重试](concepts-error-handling.md#error-handling-retrying-after-an-error)的状态机，或者创建使用 `Catch` 在出错或超时情况下转换为特定状态的状态机。有关这些错误处理技术的示例，请参阅[使用 Retry 和使用 Catch 示例](concepts-error-handling.md#error-handling-examples)。