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 函数的结构IfErrorIfError测试错误,而 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/x0 的类型是兼容的,因为它们都是数字。 如果不是,则强制第二个参数以匹配第一个参数的类型。

Excel 显示 #DIV/0! 当发生除以零时。

请改为考虑 IfError 以下事项:

IfError( 1/x, "#DIV/0!" )

上面的公式不起作用。 文本字符串 "#DIV/0!" 被强制转换为第一个参数 IfError的类型,这是一个数字。 这是另一个错误的结果 IfError ,因为无法强制文本字符串。 解决方法是将第一个参数转换为文本字符串, IfError 以便始终返回文本字符串:

IfError( Text( 1/x ), "#DIV/0!" )

如上所示,如果 ReplacementDefaultResult 是错误,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 测试错误值。

返回值为布尔值 truefalse

使用 IsError 可防止进一步处理错误。

IsBlankOrError

IsBlankOrError函数测试空白值或错误值,并且等效 。Or( IsBlank( X ), IsError( X ) )

为现有应用启用错误处理时,请考虑将 IsBlank 替换为 IsBlankOrError 保留现有应用行为。 在添加错误处理之前, 空白 值用于表示数据库中的 null 值和错误值。 Error 处理将这两种 空白 解释分开,这可能会更改继续使用 IsBlank 的现有应用的行为。

返回值为布尔值 truefalse

使用 IsBlankOrError 可防止进一步处理错误。

使用函数 Error 创建和报告自定义错误。 例如,您可能有逻辑来确定任何给定值对您的上下文是否有效—没有自动检查是否有问题的内容。 可以使用上述IfError用于函数的相同记录创建并返回自己的错误(使用 KindMessage 完成)。

在上下文 IfError中,使用 Error 函数重新引发或传递错误。 例如,逻辑 IfError 可能决定在某些情况下可以安全地忽略错误,但在其他情况下,错误非常重要。 在 IfErrorApp.OnError 中,使用 Error(FirstError) 传递错误。

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

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

语法

ErrorErrorRecord
ErrorErrorTable

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

IfErrorValue1Replacement1 [, Value2Replacement2, ...[, 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. Label1Text 属性的公式设置为:

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

    Label1 显示值 1234 ,因为这是 Value 函数的有效输入。

  5. TextInput1 中,输入 ToInfinity

    Label1 显示 value-1 ,因为这不是 Value 函数的有效输入。 如果不将 Value 函数包装在一起 IfError,则标签不会显示任何值,因为错误值被视为 空白

另请参阅

的公式参考 Power Apps