如何在产量区块中记录无错误

问题描述

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

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

我的理解是,如果item1item2解析为None,则整个执行链停止,并且yield块不执行。您可以看到item3依赖于item2不为无,它本身依赖于item1不为无。

我想包括错误报告,但是在保留for-yield块的同时,我能想到的最好的方法如下(注意:我对Scala和函数式编程相当陌生,但是意识到以下内容不是“好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")
}

在此代码中包含错误日志以反映出某些错误的正确的“标量方式”是什么,例如"Item1 was not found""Item2 was empty"。您可以在for-yield块中执行此操作,还是添加错误日志记录要求重构代码以不使用for-yield块?

解决方法

最好的恕我直言,是使用任一而不是 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)
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...