錯誤處理
本文介紹錯誤處理的基本概念和相關(guān)使用示例,通過重試機制及捕獲策略,幫助您輕松應(yīng)對常見錯誤,提升流程穩(wěn)定性。
基本概念
云工作流集成可能會產(chǎn)生一些預(yù)期或者非預(yù)期的錯誤,您可針對該場景選擇繼續(xù)進行該狀態(tài)的操作,或直接引導(dǎo)至下一個狀態(tài)。關(guān)鍵字FnF.ALL
為特殊選項,該選項能夠捕捉所有錯誤。工作流錯誤處理包含兩部分內(nèi)容:錯誤重試(Retry),錯誤捕獲(Catch)。
支持錯誤處理的狀態(tài)類型
針對下面的狀態(tài)類型,狀態(tài)定義中支持Retry和Catch兩個字段,分別用于聲明錯誤重試和錯誤捕獲的策略,幫助處理狀態(tài)中發(fā)生的錯誤。
在具體的錯誤處理中,總是按照先執(zhí)行Retry策略,如果Retry失敗,再執(zhí)行Catch策略的順序進行錯誤處理。
錯誤重試(Retry)
字段 | 類型 | 是否必選 | 描述 | 示例值 |
Errors | []string | 是 | 可以命中的錯誤列表,請參考常見錯誤類型。 | -MyCustomError -FnF.ALL |
Description | string | 是 | 控制臺中的策略名稱,也是對錯誤重試的描述。 | 重試策略 #1 |
MaxAttempts | int | 是 | 表示最大重試次數(shù)。 | 3 |
IntervalSeconds | int | 是 | 表示重試間隔時間,最大值是86400秒。單位:秒。 | 10 |
BackoffRate | float | 否 | 表示下一次重試間隔時間是當前重試間隔時間的倍數(shù)。 | 2 |
MaxBackoffSeconds | int | 否 | 表示運行的最大重試間隔時間,最大值是86400秒。單位:秒。 | 30 |
錯誤重試規(guī)則中,如果用戶針對同一個錯誤類型定義了多個重試規(guī)則,在實際的錯誤重試中只會優(yōu)先按照匹配到的第一個規(guī)則進行錯誤重試。
錯誤捕獲(Catch)
字段 | 類型 | 是否必選 | 描述 | 示例值 |
Errors | []string | 是 | 可以命中的錯誤列表,請參考常見錯誤類型。 | -MyCustomError -FnF.ALL |
Description | string | 是 | 控制臺中的策略名稱,也是對錯誤捕獲的描述。 | 錯誤捕獲規(guī)則 #1 |
OutputConstructor | map[string]any | 否 | 輸出構(gòu)造器,與Next搭配使用。 | 請參見輸出構(gòu)造器 |
Next | string | 是 | 捕獲到指定錯誤時,回退的狀態(tài)。 | my-next-state |
OutputConstructor與Next搭配使用,在流轉(zhuǎn)至其他狀態(tài)的場景下,本身沒有產(chǎn)生符合預(yù)期的輸出,即使流轉(zhuǎn)到下一個狀態(tài)也無法處理,因此,此處使用OutputConstructor可以直接構(gòu)造一個輸出,作為跳轉(zhuǎn)到目標狀態(tài)的輸入。
錯誤/異常捕獲規(guī)則中,如果用戶針對同一個錯誤類型定義了多個錯誤捕獲規(guī)則,在實際的錯誤處理中只會優(yōu)先按照匹配到的第一個規(guī)則進行捕獲處理。
常見錯誤類型
當前常見錯誤類型主要以函數(shù)計算集成為示例,其它集成服務(wù)相關(guān)的錯誤類型請參考對應(yīng)的集成文檔說明。
錯誤類型 | 描述 | |||
FC.{ErrorCode} | 函數(shù)計算服務(wù)返回除200的HTTP Code。常見的錯誤類型如下所示:
說明
| |||
FC.Unknown | 函數(shù)計算服務(wù)調(diào)用函數(shù)成功,但函數(shù)執(zhí)行出錯,且該錯誤碼未被捕獲,例如 | |||
{CustomError} | 被調(diào)用方主動拋出的自定義異常錯誤,例如函數(shù)內(nèi)部業(yè)務(wù)錯誤,云工作流內(nèi)部業(yè)務(wù)錯誤。 | |||
FnF.TaskTimeout | 云工作流某步驟執(zhí)行超時。 | |||
FnF.Timeout | 云工作流整體執(zhí)行超時。 | |||
FnF.ALL | 捕獲云工作流系統(tǒng)的所有錯誤。 |
常見錯誤處理示例
基礎(chǔ)錯誤重試
本示例中如果“my-error-handle-example”集成調(diào)用產(chǎn)生錯誤,且命中MyCustomException1
,則依照策略最大重試3次,每次重試次數(shù)3次耗盡后,當前錯誤會命中MyCustomException1
的錯誤捕獲規(guī)則,通過OutputConstructor構(gòu)造一個自定義的錯誤輸出,作為輸入流轉(zhuǎn)至ErrorCatchExit
狀態(tài)。
Type: StateMachine
Name: ErrorHandleExample
SpecVersion: v1
Description: 基礎(chǔ)錯誤處理示范
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示例應(yīng)替換為您實際的函數(shù)ARN。獲取函數(shù)ARN的方法,請參見創(chuàng)建事件函數(shù)。
regionId:應(yīng)為您函數(shù)所在的阿里云地域,例如"cn-beijing"或"cn-hangzhou"。
accountId:應(yīng)為您的阿里云賬號(主賬號)ID。
myfunction:應(yīng)為您的實際函數(shù)名稱。
LATEST:表示使用最新版本的函數(shù),您可以根據(jù)需要指定具體的版本或別名。
MyCustomException1:您可根據(jù)業(yè)務(wù)的需求,修改成符合您需要的錯誤信息。
退避錯誤重試
本示例中如果“my-error-handle-example”集成調(diào)用產(chǎn)生錯誤,且命中 MyCustomException2
或 MyCustomException3
,則依照策略最大重試3次,初始重試間隔時間是5秒,按照每次退避2.0的速率,會按照 [5, 10, 20, 40] 的間隔時間進行重試,重試次數(shù)3次耗盡后,當前錯誤會命中MyCustomException2
或MyCustomException3
的錯誤捕獲規(guī)則,通過OutputConstructor構(gòu)造一個自定義的錯誤輸出,作為輸入流轉(zhuǎn)至ErrorCatchExit
狀態(tài)。
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
復(fù)雜重試策略
本示例中如果“my-error-handle-example”集成調(diào)用產(chǎn)生錯誤,通過聲明針對FnF.ALL
的錯誤重試和錯誤捕獲,當發(fā)生除MyCustomException1
,MyCustomException2
,MyCustomException3
外的其它任何錯誤時,都會首先進行重試,依照策略最大重試3次,初始重試間隔時間是5秒,按照每次退避2.0的速率,由于設(shè)置了最大退避重試間隔時間,由于最后一次退避間隔時間40s大于了設(shè)置的最大退避重試間隔時間30s,所以實際會按照 [5, 10, 20, 30] 的間隔時間進行重試,重試次數(shù)3次耗盡后,會命中FnF.ALL
的錯誤捕獲規(guī)則,由于沒有自定義的OutputConstructor構(gòu)造, 默認流轉(zhuǎn)至ErrorCatchExit
狀態(tài)。
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