Error、IfError、IsError 和 IsBlankOrError 函式
適用於: 畫布應用程式 Dataverse 公式欄 桌面流程 模型導向應用程式 Power Pages Power Platform CLI
偵測錯誤並提供替代值或採取動作。 建立自訂錯誤或傳遞錯誤。
Note
- 只有在設定> 即將推出的功能> 預覽版中的公式層級錯誤管理預覽功能開啟時,本文描述的行為才會開放使用。
IfError
IfError 函式會測試值,直到發現錯誤為止。 如果函式發現錯誤,該函式會評估並返回對應的取代值,並停止進一步評估。 找不到錯誤時,也可以提供預設值。 IfError 的結構類似 If 函式的結構:IfError 測試錯誤,而 If 測試是否為 true。
使用 IfError 將錯誤替換為有效值,讓下游計算可以繼續。 例如,如果使用者輸入可能會造成被零除,請使用此函式:
IfError( 1/x, 0 )
如果 x
值為零,此公式會返回 0
,因為 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 將傳回與 替代 公式或 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。 |
Observed | 文字字串 | 將錯誤呈現給使用者的位置,用於報表。 例如,對於繫結至控制項屬性的公式,其格式為 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 的空白記錄或空白資料表不會導致錯誤。
語法
Error( ErrorRecord )
Error( ErrorTable )
- ErrorRecord – 必要項目。 錯誤資訊記錄,包括種類、訊息和其他欄位。 種類是比要項目。 FirstError 可以直接傳遞。
- ErrorTable – 必要項目。 錯誤資訊記錄的資料表。 AllErrors 可以直接傳遞。
IfError( Value1, Replacement1 [, Value2, Replacement2, ... [, DefaultResult ] ] )
- Value(s) – 必要項目。 要測試錯誤值的公式。
- Replacement(s) – 必要項目。 若符合 值 的引數傳回錯誤,則要評估的公式及要傳回的值。
- DefaultResult - 非必要項目。 此公式找不到任何錯誤時要計算的公式。
IsError( Value )
IsBlankOrError( Value )
- 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( "There was an internal problem" ) ) | 第一個引數傳回錯誤值 (因除以零)。 此函式評估第二個引擎並對使用者顯示訊息。 IfError 的傳回值是 Notify 的傳回值,已強制轉型為與 IfError 第一個引數相同的類型 (數字)。 | 1 |
簡易 IsError
公式 | 描述 | 結果 |
---|---|---|
IsError( 1 ) | 此引數不是錯誤。 | False |
IsError( Blank() ) | 此參數為空白,但不是錯誤。 | False |
IsError( 1/0 ) | 此引數是錯誤。 | True |
If( IsError( 1/0 ), Notify( "There was an internal problem" ) ) | IsError 引數傳回錯誤值 (因為除以零)。 此函式會傳回 True,這會造成 If 使用 Notify 函式向使用者顯示訊息。 If 的傳回值是 Notify 的傳回值,已強制轉型為與 If 第一個引數相同的類型 (布林值)。 | True |
簡單 IsBlankOrError
公式 | 描述 | 結果 |
---|---|---|
IsBlankOrError( 1 ) | 參數不是錯誤或空白。 | False |
IsBlankOrError( Blank() ) | 引數為空白。 | True |
IsBlankOrError( 1/0 ) | 此引數是錯誤。 | True |
簡單的錯誤
在此範例中,日期會相對於另一個日期進行驗證,因此如果發生問題就會導致錯誤。
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。
因為對 Value 函式是有效輸入,所以 Label1 將顯示值 1234。
在 TextInput1 中,輸入 ToInfinity。
因為對 Value 函式不是有效輸入,所以 Label1 將顯示值 -1。 若未以 IfError 包裝 Value 函式,則因為錯誤值視同 空白 處理,標籤不會顯示任何值。