gpt4 book ai didi

scala - 如何在 for-yield block 中记录 None 错误

转载 作者:行者123 更新时间:2023-12-02 02:39:59 25 4
gpt4 key购买 nike

我的 Scala 代码结构与以下类似

for {
item1 <- findItem1
item2 <- item1.get("item2_info")
} yield {
val item3 = createItem3(item2)
if (logic_using_item3) {
do something here
}
}

我的理解是,如果item1item2解析为None,那么整个执行链就会停止,并且yield block 也会停止。没有被处决。您可以看到 item3 依赖于 item2 不为 None,而它本身又依赖于 item1 不为 None。

我想包含错误报告,但在保留 for-yield block 的同时我能想到的最好的方法是以下(注意:我对 Scala 和函数式编程相当陌生,但意识到以下内容并不“好”斯卡拉”):

val x = for {
item1 <- findItem1
item2 <- item1.get("item2_info")
} yield {
val item3 = createItem3(item2)
if (logic_using_item3) {
do something here
}
}
if (x == None) {
logger.error("Something went wrong")
}

在此代码中包含错误日志以反射(reflect)出现问题的正确“Scala 方式”是什么,例如 “未找到 Item1”“Item2 为空”.您可以在 for-yield block 中执行此操作吗?或者添加错误日志记录需要重构代码以不使用 for-yield block 吗?

最佳答案

恕我直言,最好的方法是使用 Either 而不是 Option 来保留错误消息。

val result = for {
item1 <- findItem1.toRight(left = "Item1 was not found")
item2 <- item1.get("item2_info").toRight(left = "Item2 was not empty")
item3 = createItem3(item2)
if (logic_using_item3)
} yield foo

result match {
case Right(data) => ???
case Left(error) => logger.error(error)
}

关于scala - 如何在 for-yield block 中记录 None 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63782362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com