閱讀英文

共用方式為


等候重試模式

在某些情況下,數據源的行為與 Power Query 的預設 HTTP 程式代碼處理所預期的行為不符。 下列範例示範如何解決這種情況。

在此案例中,您將使用偶爾會傳回 500 狀態代碼的 REST API,指出內部伺服器錯誤。 在這些情況下,您可以等候幾秒鐘並重試,可能先重試幾次,再放棄。

ManualStatusHandling

如果 Web.Contents 取得 500 狀態代碼回應,則預設會 DataSource.Error 擲回 。 您可以藉由提供程式碼清單做為 的選擇性自變數來 Web.Contents覆寫此行為:

response = Web.Contents(url, [ManualStatusHandling={404, 500}])

藉由以這種方式指定狀態代碼,Power Query 會繼續正常處理 Web 回應。 不過,在這些情況下,一般回應處理通常不適用。 您必須瞭解已收到異常回應碼,並執行特殊邏輯來處理它。 若要判斷從 Web 服務傳回的回應碼,您可以從回應隨附的 meta Record 存取它:

responseCode = Value.Metadata(response)[Response.Status]

根據 responseCode 200 或 500,您可以正常處理結果,或遵循您將在下一節中充實的等候重試邏輯。

IsRetry

Power Query 具有本機快取,可儲存先前對 Web.Contents 呼叫的結果。 輪詢新回應的相同 URL,或在錯誤狀態之後重試時,您必須確定查詢會忽略任何快取的結果。 您可以藉由在呼叫 函式時加入 IsRetry 選項來執行 Web.Contents 此動作。 在這裡範例中,我們會在迴圈的第一次反覆Value.WaitFor項目之後設定IsRetrytrue

Value.WaitFor

Value.WaitFor() 是標準 協助程式函 式,通常不需修改即可使用。 其運作方式是建置重試嘗試清單。

producer 參數

這包括要重試的工作。 它會以函式表示,讓反覆專案編號可用於邏輯中 producer 。 預期的行為是 producer ,如果判斷需要重試,則會傳回 null 。 如果 以外的 null 任何專案由 producer傳回 ,則該值會由 傳回 Value.WaitFor

delay 參數

這包括在重試之間執行的邏輯。 它會以函式表示,讓反覆專案編號可用於邏輯中 delay 。 預期的行為是 delay 傳回 Duration。

count 自變數 (選擇性)

您可以藉由提供數位給 count 自變數,來設定重試次數上限。

整體回顧

下列範例示範如何在 ManualStatusHandling 500 回應時實作延遲重試,以及 Value.WaitFor 可用來實作延遲重試。 每次嘗試重試之間的等候時間會加倍,最多重試 5 次。

let
    waitForResult = Value.WaitFor(
        (iteration) =>
            let
                result = Web.Contents(url, [ManualStatusHandling = {500}, IsRetry = iteration > 0]),
                status = Value.Metadata(result)[Response.Status],
                actualResult = if status = 500 then null else result
            in
                actualResult,
        (iteration) => #duration(0, 0, 0, Number.Power(2, iteration)),
        5)
in
    if waitForResult = null then
        error "Value.WaitFor() Failed after multiple retry attempts"
    else
        waitForResult