Await抛出异常#results

时间:2015-07-08 21:02:56

标签: scala future spray

给出以下代码:

import spray.http._
import spray.client.pipelining._
import scala.concurrent.Future

implicit val system = ActorSystem()
import system.dispatcher // execution context for futures

val pipeline: HttpRequest => Future[HttpResponse] = sendReceive

val response: Future[HttpResponse] = pipeline(Get("http://spray.io/"))

以下伪代码函数等待10秒,如果HttpResponse返回则返回“GOOD”,或Await#result异常时返回“BAD”(请参阅​​docs

import scala.concurrent.Await
import scala.concurrent.duration._

def f(fut: Future[HttpResponse]): String = {
  try { 
    val result = Await.result(fut, 10.seconds)
    "GOOD"
  }
  catch e @ (_: InterruptedException | _: IllegalArgumentException 
       | _: TimeoutException ) => "BAD"
}

在我的catch中,是否只需捕获Await#result引发的异常?换句话说,我在这里没有抓到任何可能的例外吗?

1 个答案:

答案 0 :(得分:4)

Await.result本身可以抛出您捕获的异常,但是,如果它等待的未来未成功完成,它将转发未来包含的异常。您可能希望从此处阅读“阻止”部分:Futures and Promises

所以是的,可能有一些例外,你没有捕捉到,HttpResponse计算失败可能导致的任何事情。

实际代码中的阻塞通常很糟糕,应该仅用于测试目的,但是如果你真的需要,我会建议将Await包装在scala.util.Try中,这样你以后可以优雅地操作它并保持它失败的时间和原因的信息。