本文介紹錯誤處理的基本概念和相關使用樣本,通過重試機制及捕獲策略,協助您輕鬆應對常見錯誤,提升流程穩定性。
基本概念
CloudFlow整合可能會產生一些預期或者非預期的錯誤,您可針對該情境選擇繼續進行該狀態的操作,或直接引導至下一個狀態。關鍵字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可以直接構造一個輸出,作為跳轉到目標狀態的輸入。
錯誤/異常捕獲規則中,如果使用者針對同一個錯誤類型定義了多個錯誤捕獲規則,在實際的錯誤處理中只會優先按照匹配到的第一個規則進行捕獲處理。
常見錯誤類型
當前常見錯誤類型主要以Function Compute整合為樣本,其它整合服務相關的錯誤類型請參考對應的整合文檔說明。
錯誤類型 | 描述 | |||
FC.{ErrorCode} | Function Compute服務返回除200的HTTP Code。常見的錯誤類型如下所示:
說明
| |||
FC.Unknown | Function Compute服務調用函數成功,但函數執行出錯,且該錯誤碼未被捕獲,例如 | |||
{CustomError} | 被呼叫者主動拋出的自訂異常錯誤,例如函數內部業務錯誤,雲工作流程內部業務錯誤。 | |||
FnF.TaskTimeout | CloudFlow某步驟執行逾時。 | |||
FnF.Timeout | CloudFlow整體執行逾時。 | |||
FnF.ALL | 捕獲CloudFlow系統的所有錯誤。 |
常見錯誤處理樣本
基礎錯誤重試
本樣本中如果“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