| Functions | 適用對象 |
|---|---|
| Error IfError IsError |
|
| IsBlankOrError |
|
偵測錯誤並提供替代值或採取動作。 建立自訂錯誤或傳遞錯誤。
注意
如果應用程式在已停用 的設置 更新 下>禁用了>公式級錯誤管理功能,則這些功能將無法正常工作。
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/x 和 0 的類型是相容的,因為它們都是數字。 如果不是,則強制第二個參數以匹配第一個參數的類型。
Excel 顯示 #DIV/0! 當發生除以零時。
請改為考慮 IfError 以下事項:
IfError( 1/x, "#DIV/0!" )
上述公式將無法運作。 文字字串 "#DIV/0!" 會強制為第一個引數 IfError的類型 ,也是一個數字。 結果 IfError 是另一個錯誤,因為無法強制文字字串。 作為修復,請將第一個引數轉換為文字字串,以便 IfError 始終傳回文字字串:
IfError( Text( 1/x ), "#DIV/0!" )
如上所示, IfError 如果 Replacement 或 DefaultResult 是錯誤,則可以傳回錯誤。
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 ) )
當按順序啟動兩個按鈕時,上述的範例公式將會顯示下列橫幅:
通常,只有一個 FirstError 可以充分處理的錯誤 。 但是,在某些情況下可能會傳回多個錯誤。 例如,當使用公式鏈結運算子或 Concurrent 函式時。 即使在這些情況下,報表 FirstError 可能足以揭示問題,而不是讓使用者因多個錯誤而超載。 如果您仍需要單獨處理每個錯誤,則可以使用 AllErrors 資料表。
IsError
函數會 IsError 測試錯誤值。
傳回值是布林值 true 或 false。
使用可 IsError 防止對錯誤進行任何進一步處理。
IsBlankOrError
此 IsBlankOrError 函數會測試空白值或錯誤值,且相當 Or( IsBlank( X ), IsError( X ) )於 。
為現有應用程式啟用錯誤處理時,請考慮將 IsBlank 取代為 IsBlankOrError ,以保留現有的應用程式行為。 在添加錯誤處理之前, 空白 值用於表示資料庫中的 null 值和錯誤值。 Error 處理會區隔 空白的這 兩種解譯,這可能會變更繼續使用 IsBlank 的現有應用程式的行為。
傳回值是布林值 True 或 False。
使用可 IsBlankOrError 防止對錯誤進行任何進一步處理。
使用函數 Error 來建立和報告自訂錯誤。 例如,您可能會有邏輯來判斷任何指定值是否對內容有效,或是否沒有自動檢查問題。 您可以使用上述函式的IfError相同記錄,建立並傳回自己的錯誤,並完成 Kind 和 Message。
在 的內容 IfError中,使用函數 Error 來重新拋出或傳遞錯誤。 例如,您的邏輯 IfError 可能會決定在某些情況下可以安全地忽略錯誤,但在其他情況下,傳送錯誤很重要。 在 或 App.OnError 中IfError,使用 Error( FirstError ) 傳遞錯誤。
Error函式也可以傳遞錯誤資料表,如 AllErrors 資料表所示。 使用 ( AllErrors ) 來Error重新拋出所有錯誤,而不僅僅是第一個錯誤。
傳遞至Error的空白記錄或空表格不會發生錯誤。
語法
Error(錯誤 記錄 )
Error( 錯誤表 )
- ErrorRecord –必需。 Error 資訊記錄,包括 Kind、 Message等欄位。 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 ) )
逐步
新增 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 函數,標籤將不顯示任何值,因為錯誤值會被視為 空白。