共用方式為


Error、、IfErrorIsError、IsBlankOrError函數

Functions 適用對象
Error
IfError
IsError
畫布應用程式 Copilot Studio 桌面流程 Dataverse 公式欄 模型導向應用程式 Power Platform CLI Dataverse 函數 Power Pages
IsBlankOrError 畫布應用程式 Copilot Studio 桌面流程 模型導向應用程式 Power Platform CLI Dataverse 函數 Power Pages

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

注意

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

IfError

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

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

IfError( 1/x, 0 )

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

停止進一步處理

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

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

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

用於 IfError 執行動作,且只有在動作成功時才繼續處理。 適用於 IfError 此範例:

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

如果 DS1 有問題,則會執行第一個 通知。 不會再進行任何處理,包括第二個 DS2。 如果第一個 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 的布爾值不相容的記錄。 這很好,因為不存在這些 Patch 呼叫的傳回值會由 IfError傳回的情況。

注意

當行為正在進行變更時,所有引數 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!" )

如上所示, IfError 如果 ReplacementDefaultResult 是錯誤,則可以傳回錯誤。

FirstError / AllErrors

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

Error 記錄包括:

欄位 類型 描述
ErrorKind 列舉 (數字) 錯誤類別。
消息 文字字串 關於錯誤的訊息適合對最終使用者顯示。
文字字串 錯誤發生的位置,用於報表。 例如,對於綁定到控件屬性的公式,此值的格式為 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 值和錯誤值。 Error 處理會區隔 空白的這 兩種解譯,這可能會變更繼續使用 IsBlank 的現有應用程式的行為。

傳回值是布林值 TrueFalse

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

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

在 的內容 IfError中,使用函數 Error 來重新拋出或傳遞錯誤。 例如,您的邏輯 IfError 可能會決定在某些情況下可以安全地忽略錯誤,但在其他情況下,傳送錯誤很重要。 在 或 App.OnErrorIfError,使用 Error( FirstError ) 傳遞錯誤。

Error函式也可以傳遞錯誤資料表,如 AllErrors 資料表所示。 使用 ( AllErrors ) 來Error重新拋出所有錯誤,而不僅僅是第一個錯誤。

傳遞至Error空白記錄或空表格不會發生錯誤。

語法

Error(錯誤 記錄
Error錯誤表

  • ErrorRecord –必需。 Error 資訊記錄,包括 KindMessage等欄位。 kind 是必需的。 FirstError 可以直接傳遞。
  • ErrorTable –必需。 錯誤資訊記錄的資料表。 AllErrors 可以直接傳遞。

IfError值1替換1 [, 值2替換2, ...[, 預設結果 ] ])

  • 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, 通知( “內部有問題” ) ) 第一個引數傳回錯誤值 (因除以零)。 此函式評估第二個引擎並對使用者顯示訊息。 的 IfError 傳回值是 Notify 的傳回值,強制為與第一個引數 IfError 相同的類型 (a number)。 1

簡 IsError

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

簡 IsBlankOrError

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

簡 Error

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

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