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" )
)
如果 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 呼叫的傳回值。
Note
當要變更的行為進行變更時,所有 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 ) )
當按順序啟動兩個按鈕時,上述的範例公式將會顯示下列橫幅:
通常,只有一個 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 ) )
逐步
新增 Text input 控制項,若預設沒有名稱,則將其命名為 TextInput1。
新增 Label 控制項,若預設沒有名稱,則將其命名為 Label1。
將 Label1 公式的 Text 屬性設定為:
IfError( Value( TextInput1.Text ), -1 )
在 TextInput1 中,輸入 1234。
Label1 顯示值 1234 ,因為這是 Value 函數的有效輸入。
在 TextInput1 中,輸入 ToInfinity。
Label1 顯示 value-1 ,因為這不是 Value 函數的有效輸入。 若未以 IfError 包裝 Value 函式,則因為錯誤值視同 空白 處理,標籤不會顯示任何值。