我有部分方法 defaultRecover
帮助从异常中恢复。
def getName(length: Int): Future[String] = {
if (length > 0)
Future.successful("john")
else
Future.failed(new RuntimeException("failed"))
}
def defaultRecover: PartialFunction[Throwable, String] = {
case _ => "jane"
}
// easy and working
val res = getName(0) recover {
defaultRecover
}
现在的问题是: 我定义了第二个恢复方法 emergencyRecover
我想根据另一个调用的结果选择使用哪种恢复方法----。isEmergency()
.
def emergencyRecover: PartialFunction[Throwable, String] = {
case _ => "arnold"
}
// simplified - this actually calls REST API
def isEmergency(): Future[Boolean] = {
Future.successful(true)
}
// type mismatch
// required: PartialFunction[Throwable,String]
// found : Future[PartialFunction[Throwable,String]]
val res = getName(0) recover {
isEmergency() map {
case false => defaultRecover
case true => emergencyRecover
}
}
但我得到的是类型不匹配。我怎样才能实现这种错误处理?我是否需要使用其他方法而不是recover?
就像我常说的那样 鳞片 是你的朋友。你可以使用 recoverWith
. 另外,请记住,它接收的是一个局部函数,所以你必须做一些类似的事情。
val res = getName(0) recoverWith {
case e => isEmergency() map {
case false => defaultRecover(e)
case true => emergencyRecover(e)
}
}
你可以用recoverWith代替
val res2 = getName(0) recoverWith {
case _ => isEmergency().map {
case false => "jane"
case true => "arnold"
}
}