给出以下代码:
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
引发的异常?换句话说,我在这里没有抓到任何可能的例外吗?
答案 0 :(得分:4)
Await.result
本身可以抛出您捕获的异常,但是,如果它等待的未来未成功完成,它将转发未来包含的异常。您可能希望从此处阅读“阻止”部分:Futures and Promises。
所以是的,可能有一些例外,你没有捕捉到,HttpResponse
计算失败可能导致的任何事情。
实际代码中的阻塞通常很糟糕,应该仅用于测试目的,但是如果你真的需要,我会建议将Await包装在scala.util.Try
中,这样你以后可以优雅地操作它并保持它失败的时间和原因的信息。