我最近注意到 default
关键字的一个有趣行为。在某些情况下,它的作用类似于 try-catch
或 try-orElse
。
例如,如果您尝试执行以下脚本:
%dw 2.0
output application/json
---
("ABC" as Number) default "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"
然而,这还没有结束。我找不到这种行为的记录,但经过一些点击和试验后,我发现它只适用于以下错误:
- 类型强制期间的错误。尝试
("ABC"as Number) default "default"
- 使用函数引发的错误
fail
.尝试(dw::Runtime::fail("ERROR") 默认 "default"
可能还有更多,但我只能从命中和试验中获取信息,因为我找不到关于此行为的文档。
我认为第一是让开发人员能够轻松地做一些事情
payload.someField as Number default 0
没有让他们在执行强制转换之前检查null
值。我的意思是,否则,如果该字段为空,它将在 payload.someField as Number
处失败,并且需要将其重写为
(payload.someField default 0) as Number
我的问题是
- 这种行为是否可靠,我可以使用这种形式
payload.someField as Number default 0
而不必担心它会失败吗? - 是否有针对
default
关键字的这种行为的文档?
最佳答案
关于默认行为的故事正如您所说,它具有两种完全不同的功能。
- 我们都知道,当左侧为 null 时,返回右侧的值。
- 它充当某些异常的异常处理程序(这是从 dw 1 继承的,遗憾的是我们无法更改它)
我们要处理什么样的异常?
- 调用不支持null的函数
- 任何强制异常(如您发现的异常)
这种行为是否可靠,我可以使用这种形式的 payload.someField 作为 Number default 0 而不必担心它会失败吗?
对你的回答你的问题,是的,但没有推广。我建议使用 try 进行异常处理。但是是的,我们不会改变这种行为。
是否有针对 default 关键字的这种行为的文档?
我没有在 Anypoint 文档中看到它。
关于mule - 为什么 "default"关键字在某些情况下表现得像 "try + catch/orElse",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73785223/