共用方式為


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 修補程式失敗,也將會嘗試第二個 DS2 Patch 函式。 錯誤的範圍限制為連結的每個公式。

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

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

如果 DS1Patch 有問題,則會執行第一個 通知。 不會再進行任何處理,包括第二個 DS2Patch。 如果第一個 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 呼叫的傳回值。

Note

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

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

IfError( 1/x, 0 )

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

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 ) )

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

 Button 控制項已啟動,顯示 Notify 函式的通知。

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

IsError

IsError 函式測試錯誤值。

傳回值是布林值 truefalse

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

IsBlankOrError

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

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

傳回值是布林值 TrueFalse

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

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

IfError 的內容中,使用 Error 函式重新擲回或傳遞錯誤。 例如,IfError 中的邏輯可能決定在某些情況下可以放心地忽略錯誤,但是在其他情況下,該錯誤對於傳送很重要。 在 IfErrorApp.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