Error、IfError、IsError函数 IsBlankOrError

Functions 适用于
Error
IfError
IsError
画布应用 Copilot Studio Desktop 流 Dataverse 公式列 模型驱动应用 Power Platform CLI Dataverse 函数 Power Pages
IsBlankOrError 画布应用 Copilot Studio Desktop 流 模型驱动应用 Power Platform CLI Dataverse 函数 Power Pages

检测错误并提供替代值或执行操作。 创建自定义错误或传递错误。

备注

如果应用程序在已停用 的设置 更新 下>禁用了>公式级错误管理功能,则这些功能将无法正常工作。

IfError

函数 IfError 将测试值,直到找到错误。 如果此函数发现错误,函数将求值,然后返回相应的替换值,并停止进一步的求值。 如果没有发现错误,也可能提供默认值。 类似于 If 函数的结构IfError:IfError测试错误,而 If 测试为 true。

用于 IfError 将错误替换为有效值,以便下游计算可以继续。 例如,如果用户输入可能导致被零除,请使用此函数:

IfError( 1/x, 0 )

如果的值 0 为零,则返回 x 此公式,因为 1/x 会产生错误。 如果 x 不为零,则返回 1/x。

停止进一步处理

当在行为公式中将公式 chaining 在一起时,例如:

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

即使对 的 Patch 失败,也会尝试对 DS2 运行第二个 函数。 错误的范围仅限于链接的每个公式。

用于 IfError 执行作,仅在作成功时继续处理。 IfError应用于此示例:

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

如果 的 DS1 有问题,则执行第一个 Notify。 不会发生进一步的处理,包括 的第二个 DS2。 如果第一个 Patch 成功,将执行第二个 Patch。

如果提供,在未发现错误时,将返回可选的 DefaultResult 参数。 如果没有此参数,将返回最后一个 Value 参数。

基于最后一个示例,可以检查返回值 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这些修补程序调用。

备注

虽然正在进行更改的行为,但当前必须兼容所有参数 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!" )

如上所示,如果 Replacement 或 DefaultResult 是错误,IfError则可能会返回错误。

FirstError/AllErrors

在替换公式中,可通过 FirstError 记录和 AllErrors 表获得有关所发现的错误的信息。 AllErrors 是一个错误信息记录表,其中 FirstError 是此表的第一条记录的快捷方式。 FirstError 始终返回与 First(AllErrors) 相同的值。

Error 记录包括:

字段 类型 说明
类 ErrorKind 枚举(数字) 错误的类别。
消息 文本字符串 有关错误的消息,适合显示给最终用户。
源 文本字符串 错误发生的位置,用于报告。 例如,对于绑定到控件属性的公式,此值的格式为 ControlName.PropertyName。
观察 文本字符串 向用户显示错误的位置,用于报告。 例如,对于绑定到控件属性的公式,此值的格式为 ControlName.PropertyName。
详细信息 记录 有关错误的详细信息。 目前,仅提供网络错误的详细信息。 此记录包括包含 HTTP 状态代码的 HttpStatusCode,和包含来自连接器或服务的响应正文的 HttpResponse。

例如,将以下公式视为 Button 控件的 OnSelect 属性:

Set( a, 1/0 )

此公式在第二个按钮控件的 OnSelect 属性上:

IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )

当两个按钮按顺序激活时,上面的示例公式将显示以下横幅:

Button 控件激活,显示来自 Notify 函数的通知。

通常,只有一个 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 可能决定在某些情况下可以安全地忽略错误,但在其他情况下,错误非常重要。 在 IfError 或 App.OnError 中,使用 Error(FirstError) 传递错误。

Error该函数还可以传递一个错误表,如 AllErrors 表中所示。 使用 Error(AllErrors) 重新引发所有错误,而不仅仅是第一个错误。

传递的Error空白记录或空表不会导致错误。

语法

Error( ErrorRecord )
Error( ErrorTable )

  • ErrorRecord –必需。 Error 信息记录,包括 Kind、 Message 和其他字段。 kind 是必需的。 FirstError 可以直接传递。
  • ErrorTable –必需。 错误信息记录表。 AllErrors 可以直接传递。

IfError( Value1, Replacement1 [, Value2, Replacement2, ...[, DefaultResult ] ])

  • values– 必需。 测试错误值的公式。
  • Replacements(替换) –必需。 匹配的 Value 参数返回错误时要求值的公式和要返回的值。
  • 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,强制转换为与第一个参数IfError相同的类型(数字)。 1

简单 IsError

公式 说明 结果
IsError( 1 ) 参数不是错误。 假
IsError(空白() 参数是空白,但不是错误。 假
IsError( 1/0 ) 参数是错误。 真
如果( IsError1/0),通知(“有内部问题”) 返回 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 函数的有效输入。 如果不将 Value 函数包装在一起 IfError,则标签不会显示任何值,因为错误值被视为 空白。

另请参阅

的公式参考 Power Apps