錯誤和條件式執行

適用於: Azure Data Factory Azure Synapse Analytics

Tip

Data Factory in Microsoft Fabric 是下一代的 Azure Data Factory,擁有更簡單的架構、內建 AI 及新功能。 如果你是資料整合新手,建議先從 Fabric Data Factory 開始。 現有的 ADF 工作負載可升級至 Fabric,以存取資料科學、即時分析與報告等新能力。

條件路徑

Azure Data Factory 與 Synapse Pipeline 協調允許條件邏輯,並允許使用者根據先前活動的結果採取不同路徑。 使用不同的路徑可讓使用者建立健全的管線,並將錯誤處理納入 ETL/ELT 邏輯中。 總共允許四個條件式路徑,

Name Explanation
成功後 (預設通過) 如果目前活動成功,則執行此路徑
失敗後 如果目前活動失敗,則執行此路徑
完成後 在目前活動完成之後執行此路徑,無論是否成功
略過時 如果活動本身未執行,則執行此路徑

顯示活動延伸出四個分支的螢幕擷取畫面。

您可以在活動之後新增多個分支,但有一個例外: 完成時 路徑無法與 [成功時 ] 或 [ 失敗時] 路徑共存。 對於每次管線執行,系統會根據活動的執行結果,最多啟用其中一條路徑。

錯誤處理

常見的錯誤處理機制

Try Catch 區塊

在此方法中,客戶定義業務邏輯,並只定義「失敗時」路徑以捕捉前一個活動的任何錯誤。 在此方法中,如果 Upon Failure 路徑成功,則管線會顯示為成功。

顯示 try catch 區塊定義和結果的螢幕快照。

Do If Else 區塊

在此方法中,客戶定義商務邏輯,並定義「失敗時」和「成功時」路徑。 在此方法中,即使 Upon Failure 路徑成功,管線仍會顯示為失敗。

此螢幕快照顯示 do if else 區塊的定義和結果。

執行 If Skip Else 區塊

在此方法中,客戶定義商務邏輯,並定義「失敗時」路徑和「成功時」路徑,還附加虛擬的「跳過時」活動。 在此方法中,如果 Upon Failure 路徑成功,則管線會顯示為成功。

螢幕快照顯示「do if skip else」區塊的定義和結果。

摘要資料表

Approach Defines 當活動成功時,整體管線會顯示 當活動失敗時,整體管線會顯示
Try-Catch 僅有 Upon Failure 路徑 Success Success
Do-If-Else 「失敗時」路徑 +「成功時」路徑 Success Failure
Do-If-Skip-Else Upon Failure 路徑 + Upon Success 路徑 (末端附有 Dummy Upon Skip) Success Success

如何判斷管線失敗

不同的錯誤處理機制會導致管線的狀態不同:有些管線失敗,而有些是成功。 我們如下判斷管線成功和失敗:

  • 評估所有葉節點活動的結果。 如果葉節點活動遭到略過,則改為評估其父活動
  • 當且僅當所有節點成功通過評估時,管線結果才會成功。

假設 Upon Failure 活動和 Dummy Upon Failure 活動皆成功,

  • 在 Try-Catch 方法中,

    • 當前一個活動成功時:Upon Failure 節點會被略過,其父節點成功;整體管線成功
    • 當前一個活動失敗時,失敗時節點會被啟動,但整體流程仍然成功完成。
  • 在 Do-If-Else 方法中,

    • 當前一個活動成功時:Upon Success 節點成功,而 Upon Failure 節點被略過 (且其父節點成功);整體管線成功
    • 當前一個活動失敗時:Upon Success 節點會被略過,其父節點失敗;整體管線失敗
  • 在 Do-If-Skip-Else 方法中,

    • 當前一個活動成功時:Dummy Upon Skip 節點會被略過,其父節點 Upon Success 成功;另一個節點活動 Upon Failure 也會被略過,且其父節點成功;整體管線成功
    • 當前一個活動失敗時:Upon Failure 節點成功,且 Dummy Upon Skip 成功;整體管線成功

條件式執行

當我們開發更複雜且彈性的管線時,有時需要將條件式執行引入邏輯:只有在符合特定條件時才執行特定活動。 有很多使用案例,例如:

  • 如果先前的複製工作成功,則執行後續活動,例如傳送電子郵件通知
  • 如果先前的任何活動失敗,則執行錯誤處理工作
  • 如果活動本身或其對應的錯誤處理活動成功,則繼續進行下一個步驟
  • etc.

在這裡,我們會說明一些常見的邏輯,以及如何在 ADF 中實作它們。

單一活動

以下是單一活動之後的一些常見模式。 我們可以使用這些模式作為建置區塊,以建構複雜的工作流程。

錯誤處理

模式是 ADF 中最常見的條件邏輯。 針對「失敗時」路徑定義錯誤處理活動,如果主要活動失敗,則叫用該活動。 它應該作為最佳實務,納入所有需要後援替代方案或記錄的關鍵任務步驟中。

顯示任務關鍵步驟錯誤處理的螢幕快照。

盡力而為步驟

某些步驟 (例如資訊記錄) 較不重要,且其失敗不應該封鎖整個管線。 在這種情況下,我們應該採用最大努力策略:將後續步驟新增至「完成時」路徑,以解除封鎖工作流程。

顯示盡力記錄嘗試的螢幕擷取畫面。

And

第一種也是最常見的情況是條件式「and」:只有在先前活動成功時,才繼續執行管線。 例如,您可能有多個複製活動需要先成功,再移至下一個階段的數據處理。 在 ADF 中,可以輕鬆地達成此行為:為下一個步驟宣告多個相依性。 多條線在圖形上意指指向下一個活動。 您可以選擇「成功時」路徑,以確保相關依賴已經成功完成,或選擇「完成時」路徑,允許在條件允許下盡力執行。

在這裡,只有在兩個 Web 活動都成功時,才會執行後續等候活動。

顯示只有在兩個 Web 活動都成功時,管線才會繼續執行的螢幕擷取畫面。

而這裡,當 ActivitySucceeded 通過且 ActivityFailed 完成時,後續等候活動就會執行。 請注意,使用「成功時」路徑 ActivitySucceeded 必須成功,而「完成時」路徑上的 ActivityFailed 會盡最大努力執行,也就是說,可能會失敗。

顯示當第一個 Web 活動成功且第二個 Web 活動完成時,管線繼續執行的螢幕擷取畫面。

Or

第二種常見情況是條件式「or」:只要任一相依項成功或失敗,就執行活動。 在這裡,我們需要使用「完成後」路徑、If 條件活動和表達式語言。

在深入探討程式碼之前,我們需要再了解一件事。 活動執行並完成之後,您可以使用 @activity('ActivityName') 來參考其狀態。狀態。 結果不是「Succeeded」,就是「Failed」。 我們使用此屬性來建置條件式或邏輯。

共用錯誤處理記錄步驟

在某些情況下,如果先前的任何活動失敗,您可能想要叫用共用錯誤處理或記錄步驟。 您可以像這樣建置管線:

  • 平行執行多個活動
  • 在 True 分支中,新增 if 條件以包含錯誤處理步驟
  • 使用「完成時」路徑,將各活動連接到條件活動
  • 條件活動的邏輯運算式如下
@or(equals(activity('ActivityFailed').Status, 'Failed'), equals(activity('ActivitySucceeded').Status, 'Failed'))
  • 注意:如果您有兩個以上的相依活動,則需要串接 or,例如,
@or(or(equals(activity('ActivityFailed').Status, 'Failed'), equals(activity('ActivitySucceeded1').Status, 'Failed')),equals(activity('ActivitySucceeded1').Status, 'Failed'))

此螢幕快照顯示如果先前任何活動失敗,將如何執行共用錯誤處理步驟。

如果有任何活動成功,則為綠燈

當您的所有活動都盡最大努力時,如果有任何先前的活動成功,您可能會想要繼續進行下一個步驟。 您可以像這樣建置管線:

  • 平行執行多個活動
  • 在 True 分支中,新增 if 條件以包含後續步驟
  • 使用「完成時」路徑,將各活動連接到條件活動
  • 條件活動的邏輯運算式如下
@or(equals(activity('ActivityFailed').Status, 'Succeeded'), equals(activity('ActivitySucceeded').Status, 'Succeeded'))
  • 注意:圖表看起來與上一個案例完全相同。 唯一的差異是使用的運算式語言

顯示只要任一活動通過,管線就會繼續到下一步的螢幕擷取畫面。

複雜情境

所有活動都需要成功才能繼續

此模式是兩者的組合:條件式 and + 錯誤處理。 如果所有前述活動都成功,管線會繼續進行後續步驟,否則它會執行共用的錯誤記錄步驟。 您可以像這樣建置管線:

  • 平行執行多個活動
  • 新增 if 條件。 在 True 分支中新增後續步驟,並在 False 分支中新增錯誤處理程式碼
  • 使用「完成時」路徑,將各活動連接到條件活動
  • 條件活動的邏輯運算式如下
@and(equals(activity('ActivityFailed').Status, 'Succeeded'), equals(activity('ActivitySucceeded').Status, 'Succeeded'))

螢幕快照顯示當任何活動通過時,管線會繼續進行到下一個步驟,否則將運行錯誤處理程式代碼。

常見模式

Try-Catch-Proceed

該模式相當於在程式碼中的 try catch 區塊。 管線中的活動可能會失敗。 當它失敗時,客戶必須執行錯誤處理工作來處理它。 不過,單一活動失敗不應該封鎖管線中的下一個活動。 例如,我嘗試執行複製工作,將檔案移至儲存體。 不過,它可能會在半途失敗。 在此情況下,我想要從儲存體帳戶中刪除部分複製、不可靠的檔案 (我的錯誤處理步驟)。 但之後我還是可以繼續其他活動。

若要設定模式:

  • 新增第一個活動
  • 將錯誤處理新增至 UponFailure 路徑
  • 新增第二個活動,但未連線到第一個活動
  • 將錯誤處理活動中的 UponFailure 和 UponSkip 路徑連線到第二個活動

Note

每個路徑 (UponSuccess、UponFailure 和 UponSkip) 都可以指向任何活動。 多個路徑可以指向相同的活動。 例如,UponSuccess 和 UponSkip 可以指向一個活動,而 UponFailure 指向不同的活動。

展示具有 try catch 區塊的管線之螢幕截圖。

只有在第一個活動失敗時,錯誤處理工作才會執行。 不論第一個活動是否成功,下一個活動都會執行。

一般錯誤處理

我們通常會在流程中循序執行多個任務。 如果有任何失敗,我需要執行錯誤處理工作來清除狀態,和/或記錄錯誤。 例如,我在管線中有循序執行的 Copy 活動。 如果其中任一項失敗,我需要執行指令碼工作來記錄管線失敗。

若要設定模式:

  • 建置循序資料處理管線
  • 將一般錯誤處理步驟新增至管線尾端
  • 將來自最後一個活動的 UponFailure 和 UponSkip 路徑連線到錯誤處理活動

顯示管線的螢幕快照,呈現無分支的管線中之一般錯誤處理。

最後一個步驟:一般錯誤處理,只會在先前的任何活動失敗時執行。 如果全部成功,則不會執行。

您可以針對錯誤處理新增多個活動。

顯示在沒有分支且包含多個活動的管線中使用一般錯誤處理的螢幕擷取畫面。

Data Factory 計量和警示

以視覺化方式監視