【问题标题】:Why the "default" keyword acts like "try + catch / orElse" in some cases为什么在某些情况下 \"default\" 关键字的行为类似于 \"try + catch / orElse\"
【发布时间】:2022-10-07 16:33:21
【问题描述】:

我最近注意到default 关键字的一个有趣行为。在某些情况下,它的作用类似于try-catchtry-orElse

例如,如果您尝试执行以下脚本:

%dw 2.0
output application/json
---
(\"ABC\" as Number) default \"Invalid number\"

你会得到Invalid number!!的输出。但是,如果您删除默认部分并仅尝试(\"ABC\" as Number),它将引发错误提示Cannot coerce String (ABC) to Number ,这是预期的。

看起来该语句的行为与以前一样

%dw 2.0
import * from dw::Runtime
output application/json
---
try(() -> (\"ABC\" as Number)) orElse \"Invalid number\"

然而,这还不是结束。我找不到这种行为记录在案,但经过一些点击和试验后,我发现它仅适用于以下错误:

  1. 类型强制期间出错。试试(\"ABC\" as Number) default \"default\"
  2. 使用函数fail 引发的错误。试试(dw::Runtime::fail(\"ERROR\") default \"default\"

    可能还有更多,但我只能从命中和试验中获取信息,因为我找不到有关此行为的文档。

    我认为 #1 是让开发人员能够轻松地做类似的事情

    payload.someField as Number default 0
    

    无需他们检查 null做胁迫。我的意思是,否则,如果该字段为空,它将在payload.someField as Number 失败,这将需要重写为

    (payload.someField default 0) as Number 
    

    我的问题是

    1. 这种行为可靠吗?我可以使用payload.someField as Number default 0 这个表单而不用担心它会失败吗?
    2. default 关键字的这种行为是否有文档?

    标签: mule dataweave mule4


    【解决方案1】:

    关于默认行为的故事正如您所说,它具有两种完全不同的功能。

    1. 是我们都知道的一个,即当左侧为空时,返回右侧的内容。
    2. 它充当某些异常的异常处理程序(这是从 dw 1 继承的,遗憾的是我们无法更改它)

      我们正在处理什么样的异常?

      1. 调用不支持的函数无效的
      2. 任何强制异常(如您找到的那个)

        这种行为是否可靠,我可以使用这个表单 payload.someField 作为 Number default 0 而不必担心它会失败吗?

        回答你的问题,是的,但没有提升。我建议使用尝试用于异常处理。但是,是的,我们不会改变这种行为。

        默认关键字的这种行为是否有文档?

        我在 Anypoint 文档中没有看到它。

    【讨论】:

    • 谢谢你的澄清。所以你说的是它支持一些异常处理,但它不是一个期望的行为,对吗?
    • 您能否还解释一下“调用不支持 null 的函数”。我试过这个daysBetween(null, now()) default "",但我收到函数需要日期的错误
    • @HarshankBansal 对于您的第一个问题,就像在 dw 1 中一样,我们没有使用任何模块来支持一些奇怪的情况,例如多种格式的情况。对于您的第二个问题,是的,类型检查器不会允许它,但是类型检查器没有意识到值是 Any 例如 %dw 2.0 output application/json var a: Any = null fun test(a: String ) = a --- test(a) 默认“123”
    • 啊,好吧。我想将此作为示例添加到您的答案中。感谢您的回复
    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多