错误处理

与 Excel 和 DAX 语言具有 IFERROR 函数的方式类似,Power Query 具有自己的语法来测试和捕获错误。

如有关 处理 Power Query 中的错误的文章中所述,错误可以出现在步骤级别或单元格级别。 本文重点介绍如何根据自己的特定逻辑捕获和管理错误。

注释

为了演示此概念,本文使用 Excel 工作簿作为其数据源。 此处展示的概念适用于 Power Query 中的所有值,而不仅仅是来自 Excel 工作簿的概念。

此演示的示例数据源是具有以下表的 Excel 工作簿。

Excel 工作簿中包含三个错误的示例数据的屏幕截图。

Excel 工作簿中的此表在标准费率列中出现 Excel 错误,例如 #NULL!#REF!#DIV/0!。 将此表导入 Power Query 编辑器时,下图显示了其外观。

Power Query 中加载的示例表的屏幕截图。

请注意,Excel 工作簿中每个单元格中的错误及其 [Error] 值是如何显示的。

本文介绍如何将错误替换为另一个值。 此外,您还学习如何捕获错误并将其用于您自己的特定逻辑。

查找错误时提供替代值

在这种情况下,目标是在示例数据源中创建新的 “最终费率 ”列,该列使用 “标准费率 ”列中的值。 如果存在任何错误,则它使用相应 “特殊速率 ”列中的值。

若要创建新的自定义列,请转到 “添加列 ”菜单,然后选择“ 自定义”列。 在 “自定义列” 窗口中,输入公式 try [Standard Rate] otherwise [Special Rate]。 将此新列命名为 最终速率

打开“自定义列”对话框并在自定义列中输入“try otherwise”公式的屏幕截图。

如果找不到错误,此公式将尝试评估 标准速率 列并输出其值。 如果在 “标准速率 ”列中找到错误,则输出是在语句之后 otherwise 定义的值,在本例中为 “特殊费率 ”列。

将正确的数据类型添加到表中的所有列后,下图显示了最终表的外观。

表的屏幕截图,其中标准速率错误被最终速率列中的特殊速率所取代。

注释

作为替代方法,还可以输入与上一个公式等效的公式 try [Standard Rate] catch ()=> [Special Rate],但对不需要参数的函数使用 catch 关键字。

catch 关键字于 2022 年 5 月引入 Power Query。

提供自己的条件错误逻辑

使用与上一部分相同的示例数据源,新目标是为 最终费率创建新列。 如果 标准费率 中的值存在,则使用该值。 否则,将使用 “特殊速率 ”列中的值,但包含任何 #REF! 错误的行除外。

注释

排除 #REF! 错误的唯一目的是为了演示目的。 使用本文中展示的概念,可以从错误记录中定位所选的任何字段。

选择错误值旁边的任意空格时,屏幕底部会显示详细信息窗格。 详细信息窗格包含错误原因DataFormat.Error和错误消息: Invalid cell value '#REF!'

所选错误的屏幕截图,对话框底部有一条错误消息。

每次只能选择一个单元格,因此实际上每次只能查看一个错误值的错误组件。 此时会创建新的自定义列并使用 try 表达式。

与自定义逻辑一起使用try

若要创建新的自定义列,请转到 “添加列 ”菜单,然后选择“ 自定义”列。 在 “自定义列” 窗口中,输入公式 try [Standard Rate]。 将此新列命名 为“所有错误”。

打开“自定义列”对话框的屏幕截图,并在自定义列中输入了试用公式。

表达式 try 将值和错误转换为记录值,该值指示表达式是否 try 处理错误,以及正确的值或错误记录。

表的屏幕截图,其中添加了“所有错误”列,并以“记录”形式显示错误。

可以使用记录值展开此新建的列,并通过选择列标题旁边的图标来查看要展开的可用字段。

“所有错误”列的屏幕截图,其中突出显示了展开图标,选中了“HasError”、“值”和“错误”框。

此操作公开三个新的字段:

  • All Errors.HasError——用于显示标准速率列中的值是否有错误。
  • 所有 Errors.Value — 如果 “标准费率 ”列中的值没有错误,则此列显示 “标准费率 ”列中的值。 对于出现错误的值,此字段不可用,在展开作期间,此列具有 null 值。
  • 所有 Errors.Error — 如果 标准速率 列中的值出现错误,则此列会显示 标准速率 列值的错误记录。 对于没有错误的值,此字段不可用,在展开操作期间,此列包含null值。

表的屏幕截图,其中列包含新字段,其中选择了一个 All.Errors.Error 值,并显示表下方的错误消息。

若要进一步调查,可以扩展 所有 Errors.Error 列以获取错误记录的三个组件。

  • 错误原因
  • 错误消息
  • 错误详细信息

执行展开操作后,All Errors.Error.Message字段将显示特定的错误消息,告知您每个单元格的 Excel 错误。 错误消息派生自错误记录的 “错误消息 ”字段。

显示特定错误消息的屏幕截图。

现在,每个错误消息都在新列中,您可以创建一个名称为最终速率的新条件列,并包含以下子句:

  • 如果 “所有 Errors.Error.Message ”列中的值相等 null,则输出是 “标准速率 ”列中的值。
  • 否则,如果 “所有 Errors.Error.Message ”列中的值不相等 Invalid cell value '#REF!'.,则输出是 “特殊速率 ”列中的值。
  • 否则为 null。

“添加条件列”对话框的屏幕截图,其中包含为新列设置的所有错误条件。

仅保留 “帐户”、“ 标准费率”、“ 特殊费率”和“ 最终费率 ”列并为每个列添加正确的数据类型后,下图演示了最终表的外观。

包含具有适当数据类型的剩余列的最终表的屏幕截图。

使用 trycatch 自定义逻辑

或者,您还可以使用trycatch这两个关键字创建一个新的自定义列。

try [Standard Rate] catch (r)=> if r[Message] <> "Invalid cell value '#REF!'." then [Special Rate] else null

自定义列对话框的屏幕截图,其中包含展示 try 和 catch 语法方法的新公式。