Share via


Error、IfError、IsError 和 IsBlankOrError 函式

適用於: 畫布應用程式 Dataverse 公式欄 桌面流程 模型導向應用程式 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修補程式失敗,也將會嘗試第二個 DS2Patch 函式。 錯誤的範圍限制為連結的每個公式。

使用 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 將傳回與 替代 公式或 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
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 ) )

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

 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空白記錄或空白資料表不會導致錯誤。

語法

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

逐步

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

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

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

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

    因為對 Value 函式是有效輸入,所以 Label1 將顯示值 1234

  5. TextInput1 中,輸入 ToInfinity

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

請參閱

Power Apps 公式參考