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

标签 scala error-logging for-comprehension scala-option

我的 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/

相关文章:

c# - MVC 4 Web 应用程序中的应用程序范围日志记录

c# - 新手从哪里开始在 asp.net c# 中记录错误?

scala - 组成 future 和期权

scala:如何使用 for comprehension 重写此函数

scala - 我应该如何在 Scala 和 Anorm 中使用 MayErr[IntegrityConstraintViolation,Int]?

php - 将错误记录到文件 (PHP + IIS6 + FastCGI + Win2003 Server)

scala - Scala 序列的通用函数,如 `Seq` 、 `IndexedSeq` 、 `List`

scala - Scala 中无法解释的理解结果

json - scala play json 读取 seal 特征或枚举类型对象

scala - 如果过滤函数导致空列表,则返回未过滤列表