由于 Future 的结果是与程序的其它部分并发生成的,因此异常需要作特殊的处理。 不管是 Actor 或是派发器正在完成此 Future, 如果抛出了 Exception ,Future 将持有这个异常而不是一个有效的值. 如果 Future 持有 Exception, 调用 Await.result 将导致此异常被再次抛出从而得到正确的处理.
通过返回一个其它的结果来处理 Exception 也是可能的. 使用 recover 方法. 例如:
val future = akka.pattern.ask(actor, msg1) recover {
case e: ArithmeticException ⇒ 0
}
在这个例子中,如果actor回应了包含 ArithmeticException的akka.actor.Status.Failure , 我们的 Future 将持有 0 作为结果. The recover 方法与标准的 try/catch 块非常相似, 可以用这种方式处理多种 Exception, 如果其中有没有提到的 Exception,这种异常将 以没有定义 recover 方法的方式来处理.
你也可以使用 recoverWith 方法, 它和 recover 的关系就象 flatMap 与 map的关系, 用法如下:
val future = akka.pattern.ask(actor, msg1) recoverWith {
case e: ArithmeticException ⇒ Promise.successful(0)
case foo: IllegalArgumentException ⇒ Promise.failed[Int](new IllegalStateException("All br0ken!"))
}