【发布时间】:2014-07-29 04:21:11
【问题描述】:
我很好奇Future中的recover函数在什么情况下可以恢复抛出的异常?我正在同时使用 Akka Actor 和 Future:
这是我打未来电话的地方:
implicit val timeout = Timeout(5.seconds) //yes, I already have this line.
val response = (ActorA ? someMessage(someStuff))
.mapTo[TransOk]
.map(message => (OK, message.get))
.recover{
case e => (BadRequest, e.getMessage)
}
我发送ActorA,然后将结果映射到TransOK类,最后我添加.recover{}。
那么这是ActorA的方法:
case someMessage(stuff) =>
//the exception being thrown here is not captured by Future.recover() method
//why!?
val id = if (some.canFind(stuff)) doSomething()
else throw new Exception("ERROR ERROR!")
val result: Try[SomeDBType] = DAL.db.withSession { implicit session =>
Try(DB.findStuff(stuff))
}
result match {
case Success(content) => sender ! TransOk(content)
case Failure(ex) => throw ex //let it escalate
}
有趣的是:.recover() 没有捕获到第一个异常。那么recover在什么情况下能够捕获到异常呢?我认为它涵盖了正在调用的方法中发生的所有异常。
【问题讨论】: