scala.concurrent.Future 抛出异常

Throwing exception from a scala.concurrent.Future

我试图使用 scala.concurrent.Future 重现此问题 How do I get hold of exceptions thrown in a Scala Future?,我希望异常被吞没,但它似乎没有发生。有什么解释吗?

import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

def runWithTimeout[T](timeoutMs: Long)(f: => Future[T]) : T = {
  Await.result(f, timeoutMs.millis)
}

runWithTimeout(50) { Future { "result" } }

runWithTimeout(50) { Future { throw new Exception("deliberate") } }

Futures 不会 吞下异常(至少不是通常意义上的,这意味着 "catch and discard")。当您将来抛出异常时(在 map/flatMap 的主体中或使用 Future.apply 时),异常确实不会传播到当前线程,但会保留在未来,成为未来的结果。实际上,未来的最终结果是 Try[T],因此它将以 TSuccess[T])、 类型的正确结果来完成Throwable (Failure[T]).

另一个关键点是,当您调用 Await.result 时,您基本上是在请求通过等待未来的最终结果来阻塞当前线程,无论是正确的结果 还是异常。如果出现异常,它将在调用 Await.result 的位置重新抛出。 如果您不想重新抛出异常,可以改用 Await.ready。它将等待 future 的完成,并且只是 return future 本身,无论它是正常完成还是通过异常完成。然后你可以通过 Future.value

检索未来的结果