Error、IfError、IsError 和 IsBlankOrError 函式

適用於: 畫布應用 Dataverse 公式列 桌面流 模型驅動應用 Power Pages Power Platform CLI

偵測錯誤並提供替代值或採取動作。 建立自訂錯誤或傳遞錯誤。

注意

如果應用程式在已停用 的設置 更新 下>禁用了>公式級錯誤管理功能,則這些功能將無法正常工作。

IfError

IfError 函式會測試值,直到發現錯誤為止。 如果函數發現錯誤,該函數會評估並返回對應的取代值,並停止進一步評估。 找不到錯誤時,也可以提供預設值。 IfError 的結構類似 If 函式的結構:IfError 測試錯誤,而 If 測試是否為 true。

使用 IfError 將錯誤替換為有效值,讓下游計算可以繼續。 例如,如果使用者輸入可能會造成被零除,請使用此函數:

IfError( 1/x, 0 )

如果的值 0 為零,則返回 x 此公式,因為 1/x 會產生錯誤。 如果 x 不是零,會傳回 1/x。

停止進一步處理

當 鏈結 公式在 行為公式 中時,例如:

Patch( DS1, ... );
Patch( DS2, ... )

即使 DS1修補程式失敗,也將會嘗試第二個 DS2Patch 函式。 錯誤的範圍限制為連結的每個公式。

使用 IfError執行動作,並只在動作成功時繼續處理。 將IfError 套用在此範例:

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" ),
    Patch( DS2, ... ), Notify( "problem in the second action" )
)

如果 DS1 的 Patch 有問題,則會執行第一個 通知。 不會再進行任何處理,包括第二個 DS2 的 Patch。 如果第一個 Patch 成功,將執行第二個 修補程式。

如果提供,會在未發現任何錯誤時傳回非必要的 DefaultResult 參數。 若未此參數,則會返回最後一個 值 引數。

在上一個範例上建立,可檢查 IfError 的傳回值以判定是否有任何問題:

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" );  false,
    Patch( DS2, ... ), Notify( "problem in the second action" ); false,
    true
)

類型相容性

IfError 返回其參數之一的值。 IfError 可能傳回的所有數值類型必須相容。

在最後一個示例中, Patch 返回與用於 Replacement 公式或 DefaultResult 的布爾值不相容的記錄。 如此不錯,因為 IfError 不會傳回來自這些 Patch 呼叫的傳回值。

注意

當要變更的行為進行變更時,所有 IfError 的所有引數 類型 必須相容。

在先前描述的簡單範例中:

IfError( 1/x, 0 )

1/x 和 0 的類型是相容的,因為它們都是數字。 如果不是,則強制第二個參數以匹配第一個參數的類型。

Excel 顯示 #DIV/0! 當發生除以零時。

請考慮 IfError 改搭配下列情況:

IfError( 1/x, "#DIV/0!" )

上述公式將無法運作。 文字字串 "#DIV/0!" 被強制為 IfError 的第一個參數的類型,即一個數位。 IfError 的結果是 另一個錯誤,因為文本字串無法強制。 作為修正,請將第一個引數轉換成文字字串,讓 IfError 一直傳回文字字串:

IfError( Text( 1/x ), "#DIV/0!" )

如以上所示,如果 取代 或 DefaultResult 有誤,IfError 會傳回錯誤。

FirstError / AllErrors

在取代公式中,可透過 FirstError 記錄和 AllErrors 資料表獲得發現錯誤的相關資訊。 AllErrors 是一個錯誤信息記錄表,其中 FirstError 是此表的第一條記錄的快捷方式。 FirstError 始終返回與 First(AllErrors) 相同的值。

錯誤記錄包含:

欄位 類型​ 名描述
類 ErrorKind enum (number) 錯誤類別。
消息 文字字串 關於錯誤的訊息適合對最終使用者顯示。
源 文字字串 錯誤發生的位置,用於報表。 例如,對於綁定到控件屬性的公式,此值的格式為 ControlName.PropertyName。
觀察 文字字串 將錯誤呈現給使用者的位置,用於報表。 例如,對於綁定到控件屬性的公式,此值的格式為 ControlName.PropertyName。
詳細資料 錄製 有關錯誤的詳細資料。 目前,僅提供網路錯誤的詳細資訊。 此記錄包括包含 HTTP 狀態碼的 HttpStatusCode,和包含來自連接器或服務的回覆本文的 HttpResponse。

例如,考慮以下公式作為 Button 控制項的 OnSelect 屬性:

Set( a, 1/0 )

以及第二個 Button 控制項的 OnSelect 屬性上的公式:

IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )

當按順序啟動兩個按鈕時,上述的範例公式將會顯示下列橫幅:

按鈕控制項已啟動,顯示 Notify 函數的通知。

通常,只有一個 FirstError 可以充分處理的錯誤 。 但是,在某些情況下可能會傳回多個錯誤。 例如,當使用公式鏈結運算子或 Concurrent 函式時。 即使在這些情況下,報表 FirstError 可能足以揭示問題,而不是讓使用者因多個錯誤而超載。 如果您仍需要單獨處理每個錯誤,則可以使用 AllErrors 資料表。

IsError

IsError 函式測試錯誤值。

傳回值是布林值 true 或 false。

使用 IsError 可以防止對錯誤進行任何進一步的處理。

IsBlankOrError

IsBlankOrError函式會測試空白值或錯誤值,相當於 Or( IsBlank( X ), IsError( X ) )。

為現有應用程式啟用錯誤處理時,請考慮將 IsBlank 取代為 IsBlankOrError 以保留現有應用程式行為。 在添加錯誤處理之前, 空白 值用於表示資料庫中的 null 值和錯誤值。 錯誤處理會將這兩個空白的解釋分開,這可能會變更繼續使用 IsBlank 的現有應用程式的行為。

傳回值是布林值 True 或 False。

使用 IsBlankOrError 可以防止對錯誤進行任何進一步的處理。

使用 Error 函式來建立和報告自訂錯誤。 例如,您可能會有邏輯來判斷任何指定值是否對內容有效,或是否沒有自動檢查問題。 您可以使用先前與 IfError 函式所述的相同記錄,來建立並傳回自己的錯誤 (使用種類和訊息完成)。

在 IfError 的內容中,使用 Error 函式重新擲回或傳遞錯誤。 例如,IfError 中的邏輯可能決定在某些情況下可以放心地忽略錯誤,但是在其他情況下,該錯誤對於傳送很重要。 在 IfError 或 App.OnError 中,使用 Error( FirstError ) 來傳遞錯誤。

Error 函式也可以傳遞錯誤資料表,如 AllErrors 資料表中所示。 使用 Error( AllErrors ) 重新擲回所有錯誤,而不只是第一次個錯誤。

傳遞給 Error 的空白記錄或空白資料表不會導致錯誤。

語法

錯誤( ErrorRecord )
錯誤( ErrorTable )

  • ErrorRecord –必需。 錯誤資訊記錄,包括種類、訊息和其他欄位。 kind 是必需的。 FirstError 可以直接傳遞。
  • ErrorTable –必需。 錯誤資訊記錄的資料表。 AllErrors 可以直接傳遞。

IfError(Value1,Replacement1 [, Value2,Replacement2 ,...[, DefaultResult ] ])

  • values– 必需。 要測試錯誤值的公式。
  • Replacements(替換) –必需。 若符合 值 的引數傳回錯誤,則要評估的公式及要傳回的值。
  • DefaultResult –可選。 此公式找不到任何錯誤時要計算的公式。

IsError( 值 )
IsBlankOrError( 值 )

  • Value –必需。 要測試的公式。

範例

簡易 IfError

公式 描述 結果
IfError(1,2) 第一個引數不是錯誤。 此函數沒有其他要檢查的錯誤,而且沒有預設的傳回值。 此函式會返回最後一個評估的 Value 引數。 1
IfError(1/0,2) 第一個引數傳回錯誤值 (因為除以零的緣故)。 此函數會評估第二個引數,並傳回結果。 2
IfError(10,20,30) 第一個引數不是錯誤。 此函數沒有其他要檢查的錯誤,但有預設的傳回值。 此函式會傳回 DefaultResult引數。 30
IfError(10,11,20,21,300) 第一個引數 10 無誤,因此函式不評估引數的對應取代 11。 第三個引數 20 也無誤,因此函式不會評估該引數的對應取代 21。 第五個引數 300 沒有對應的取代,而且是預設結果。 此函數因為公式不包含任何錯誤而傳回該結果。 300
IfError (1/0,Notify(“存在內部問題”)) 第一個引數傳回錯誤值 (因除以零)。 此函數評估第二個引擎並對使用者顯示訊息。 IfError 的傳回值是 Notify 的傳回值,已強制轉型為與 IfError 第一個引數相同的類型 (數字)。 1

簡易 IsError

公式 描述 結果
IsError(1) 此引數不是錯誤。 假
IsError (空白()) 此參數為空白,但不是錯誤。 假
IsError(1/0) 此引數是錯誤。 真
If (IsError(1/0),Notify (“存在內部問題”)) IsError 引數傳回錯誤值 (因為除以零)。 此函式會傳回 True,這會造成 If 使用 Notify 函式向使用者顯示訊息。 If 的傳回值是 Notify 的傳回值,已強制轉型為與 If 第一個引數相同的類型 (布林值)。 真

簡單 IsBlankOrError

公式 描述 結果
IsBlankOrError(1) 參數不是錯誤或空白。 假
IsBlankOrError (空白()) 引數為空白。 真
IsBlankOrError(1/0) 此引數是錯誤。 真

簡單的錯誤

在此範例中,日期會相對於另一個日期進行驗證,因此如果發生問題就會導致錯誤。

If( StartDate > EndDate,
    Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )

在此範例中,一些錯誤會允許通過,而另一些則被抑制並以值取代。 在第一種情況下, b 處於錯誤狀態, 因為 Value 函數的參數無效。 由於公式編寫器會意外地執行此操作,因此會傳遞此消息,以便用戶能夠看到此消息。 在第二種情況下,使用相同的公式, b 的值為 0,導致除以零。 在這種情況下,公式寫入器可能知道這對於該邏輯是可以接受的、抑制錯誤 (不顯示任何橫幅),並改為傳回 -1。

With( {a: 1, b: Value("a")},
      IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns an error with Kind = ErrorKind.InvalidArgument

With( {a: 1, b: 0} )
      IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns -1

AllErrors 資料表可以像其他任何資料表一樣進行篩選。 與 Error 函式搭配使用時,可以移除預期的錯誤並保留和報告其餘的錯誤。 例如,如果我們知道除以零在特定上下文中不會有問題,則可以使用以下公式過濾掉這些錯誤,使所有其他錯誤保持不變:

Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )

按步就班

  1. 新增 Text input 控制項,若預設沒有名稱,則將其命名為 TextInput1。

  2. 新增 Label 控制項,若預設沒有名稱,則將其命名為 Label1。

  3. 將 Label1 公式的 Text 屬性設定為:

    IfError( Value( TextInput1.Text ), -1 )
    
  4. 在 TextInput1 中,輸入 1234。

    Label1 顯示值 1234 ,因為這是 Value 函數的有效輸入。

  5. 在 TextInput1 中,輸入 ToInfinity。

    Label1 顯示 value-1 ,因為這不是 Value 函數的有效輸入。 若未以 IfError 包裝 Value 函式,則因為錯誤值視同 空白 處理,標籤不會顯示任何值。

請參閱

的公式參考 Power Apps