本文介紹錯誤處理的核心概念和應用示例,通過重試(Retry)和捕獲(Catch)機制,幫助您有效應對工作流中的常見錯誤,提升流程穩定性。
基本概念
在云工作流中,集成操作可能遇到預期或非預期的錯誤。您可以選擇通過重試機制繼續嘗試當前操作,或通過捕獲策略引導流程至其他狀態。錯誤處理主要包含兩部分:
錯誤重試(Retry):自動重試失敗的操作,嘗試恢復執行。
錯誤捕獲(Catch):捕獲無法通過重試解決的錯誤,跳轉至指定狀態處理。
處理順序:系統先執行Retry策略,若重試失敗,再應用Catch策略。
支持錯誤處理的狀態類型
以下狀態類型支持在定義中配置retryRef和catchRef字段,以處理執行中的錯誤:
并行(Parallel)
迭代(Foreach)
操作(Operation)
錯誤處理屬性
| 字段 | 類型 | 是否必選 | 描述 | 示例值 |
|---|---|---|---|---|
| retryRef | []Retry | 否 | 包含多個Retry定義。參考下文Retry屬性。 | |
| catchRef | []Catch | 否 | 包含多個Catch定義。參考下文Catch屬性。 |
Retry屬性
定義重試策略,嘗試多次執行失敗的操作。
| 字段 | 類型 | 是否必選 | 描述 | 示例值 |
|---|---|---|---|---|
| name | string | 是 | 策略名稱,用于標識和描述重試規則。 | 404RetryPolicy |
| onErrors | []string | 是 | 可匹配的錯誤類型列表,見常見錯誤類型。 | - MyCustomError - http.404 |
| intervalSeconds | int32 | 是 | 重試間隔時間,單位秒。 | 1 |
| maxAttempts | int32 | 是 | 最大嘗試次數。 | 3 |
| backoffRate | float | 否 | 下次重試間隔的倍率。 | 2.0 |
| maxIntervalSeconds | int32 | 否 | 最大重試間隔時間,單位秒,最大86400。 | 5 |
說明:
若針對同一錯誤類型定義多條重試規則,系統優先應用匹配到的第一條規則。
Catch屬性
定義捕獲策略,處理重試后仍失敗的錯誤,跳轉至指定狀態。
| 字段 | 類型 | 是否必選 | 描述 | 示例值 |
|---|---|---|---|---|
| onErrors | []string | 是 | 可匹配的錯誤類型列表,見常見錯誤類型。 |
|
| transition | Transition | 否 | 參考流程定義介紹中Transition字段說明 |
說明:
若針對同一錯誤類型定義多條捕獲規則,系統優先應用匹配到的第一條規則。
常見錯誤類型
以下列出常見錯誤類型,其他集成服務的錯誤請參考對應文檔。
| 錯誤類型 | 描述 |
|---|---|
| http.{ErrorCode} | HTTP請求返回非200的狀態碼,如:
|
| cf.{ErrorCode} | 函數調用錯誤碼,如cf.404、cf.500。 |
| cf.InvalideArgument | 函數調用參數錯誤。 |
| cf.ParseError | 函數調用成功但結果解析失敗。 |
| cf.Unknown | 函數調用成功但執行出錯,未被捕獲的錯誤。 |
| ctapi.{ErrorCode} | 普通集成請求錯誤碼,如ctapi.404、ctapi.500。 |
| cloudflow.InvalideArgument | 云工作流執行參數錯誤。 |
| cloudflow.Unkown | 云工作流執行未被捕獲的錯誤。 |
使用示例
示例1:錯誤重試
若“FetchMyIp”節點產生http.404或http.401錯誤,系統按定義的重試策略嘗試恢復,失敗后跳轉至Final節點。
specVersion: '0.8'
version: '1.0'
name: test
start: Pass
states:
- name: Pass
type: Operation
actions:
- functionRef:
type: Noop
transition:
nextState: FetchMyIp
- name: FetchMyIp
type: Operation
actions:
- functionRef:
type: Http
arguments:
url: //httpstat.us/random/401,404
headers:
User-Agent: "apifox"
retryRef:
- name: 404RetryPolicy
onErrors:
- http.404
intervalSeconds: 1
maxIntervalSeconds: 5
maxAttempts: 5
backoffRate: 2
- name: 401RetryPolicy
onErrors:
- http.401
intervalSeconds: 1
maxIntervalSeconds: 5
maxAttempts: 3
backoffRate: 1
transition:
nextState: Final
- name: Final
type: Operation
actions:
- functionRef:
type: Noop
end: true
說明:
http.404:最多嘗試5次,初始間隔1秒,倍率2.0,間隔為[1, 2, 4, 5, 5]秒(受maxIntervalSeconds限制)。http.401:最多嘗試3次,間隔固定1秒,倍率1.0。
示例2:錯誤捕獲
若“FetchMyIp”節點調用產生http.404或http.401錯誤,系統捕獲錯誤并跳轉至Sleep節點繼續執行。
specVersion: '0.8'
version: '1.0'
name: test
start: Pass
states:
- name: Pass
type: Operation
actions:
- functionRef:
type: Noop
transition:
nextState: Sleep
- name: Sleep
type: Sleep
duration: 1s
transition:
nextState: FetchMyIp
- name: FetchMyIp
type: Operation
actions:
- functionRef:
type: Http
arguments:
url: //httpstat.us/random/401,404,200
catchRef:
- onErrors:
- http.404
transition:
nextState: Sleep
- onErrors:
- http.401
transition:
nextState: Sleep
transition:
nextState: Final
- name: Final
type: Operation
actions:
- functionRef:
type: Noop
end: true
說明:
FetchMyIp節點發起HTTP請求,URL隨機返回401、404或200狀態碼。若返回
http.404或http.401,捕獲后跳轉至Sleep節點,暫停1秒后重試。
示例3:復雜重試與捕獲策略
結合重試和捕獲,若“FetchMyIp”產生http.404或http.401錯誤,先重試,失敗后捕獲并跳轉至Sleep節點。
specVersion: '0.8'
version: '1.0'
name: test
start: Pass
states:
- name: Pass
type: Operation
actions:
- functionRef:
type: Noop
transition:
nextState: FetchMyIp
- name: FetchMyIp
type: Operation
actions:
- functionRef:
type: Http
arguments:
url: //httpstat.us/random/401,404
headers:
User-Agent: "apifox"
retryRef:
- name: 404RetryPolicy
onErrors:
- http.404
intervalSeconds: 1
maxIntervalSeconds: 3
maxAttempts: 3
backoffRate: 2
- name: 401RetryPolicy
onErrors:
- http.401
intervalSeconds: 1
maxIntervalSeconds: 3
maxAttempts: 3
backoffRate: 1
catchRef:
- onErrors:
- http.404
transition:
nextState: Final
- onErrors:
- http.401
transition:
nextState: Final
transition:
nextState: Final
- name: Final
type: Operation
actions:
- functionRef:
type: Noop
end: true
說明:
http.404:最多嘗試3次,間隔[1, 2, 3]秒,均失敗后捕獲錯誤,跳轉至Final。http.401:最多嘗試3次,間隔1秒,均失敗后捕獲錯誤,跳轉至Final。