在恢复部分方法中调用 future
Calling future in recover partial method
我有部分方法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
}
}
但是我发现类型不匹配。我怎样才能实现这种错误处理?我需要使用其他方法而不是恢复吗?
正如我常说的,scaladoc 是你的朋友。您可以使用 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"
}
}
我有部分方法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
}
}
但是我发现类型不匹配。我怎样才能实现这种错误处理?我需要使用其他方法而不是恢复吗?
正如我常说的,scaladoc 是你的朋友。您可以使用 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"
}
}