问题描述
我的Scala代码结构与以下类似
for {
item1 <- findItem1
item2 <- item1.get("item2_info")
} yield {
val item3 = createItem3(item2)
if (logic_using_item3) {
do something here
}
}
我的理解是,如果item1
或item2
解析为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)
}