

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Step Functions 狀態機器中處理錯誤條件
<a name="tutorial-handling-error-conditions"></a>

在本教學課程中，您會建立具有**任務**狀態 AWS Step Functions 的狀態機器，該狀態會叫用為擲回自訂錯誤而建置的範例 Lambda 函數。

任務是 的其中一個[後援狀態](concepts-error-handling.md#error-handling-fallback-states)，您可以為其設定`Catch`欄位。當整合收到錯誤時，擷取欄位會根據錯誤名稱選擇後續步驟。

## 步驟 1：建立拋出錯誤的 Lambda 函數
<a name="create-lambda-function-fail"></a>

使用 Lambda 函數來模擬錯誤條件。

1. 在 https：//[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) 開啟 AWS Lambda 主控台。

1. 選擇**建立函數**。

1. 選擇**使用藍圖**、搜尋 `Step Functions`，然後選擇**擲回自訂錯誤**。

1. 針對**函數名稱**，請輸入 `ThrowErrorFunction`。

1. 針對 **Role (角色)**，選擇 **Create a new role with basic Lambda permissions (建立具備基本 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 主控台建立使用 [任務工作流程狀態](state-task.md) 搭配`Catch`組態的狀態機器。狀態機器會叫用 Lambda 函數，您已建置此函數來模擬在叫用函數時擲回錯誤。Step Functions 在重試之間使用指數退避來重試函數。

1. 開啟 [Step Functions 主控台](https://console.aws.amazon.com/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. 切換回**設計**模式，然後選取名為 **CreateAccount** **的 Lambda：調用**任務狀態。

1. 在**組態**索引標籤上，尋找 **API 引數**。針對**函數名稱**，選擇您先前建立的 Lambda 函數。

1. 選擇**建立**，檢閱角色，然後選擇**確認**以建立您的狀態機器。

## 步驟 5：執行狀態機器
<a name="error-conditions-execution"></a>

建立和設定狀態機器之後，您可以執行它並檢查流程。

1. 在編輯器中，選擇**執行**。

   或者，從**狀態機器**清單中，選擇**開始執行**。

1. 在**開始執行**對話方塊中，接受產生的 ID，並在**輸入**中輸入下列 JSON：

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

1. 選擇 **Start execution (開始執行)**。

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.aws.amazon.com/zh_tw/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`用來轉換為特定狀態的機器。如需錯誤處理技巧的範例，請參閱[使用重試和擷取的範例](concepts-error-handling.md#error-handling-examples)。