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]
,因此它将以 T
(Success[T]
)、 或 类型的正确结果来完成Throwable
(Failure[T]
).
另一个关键点是,当您调用 Await.result
时,您基本上是在请求通过等待未来的最终结果来阻塞当前线程,无论是正确的结果 还是异常。如果出现异常,它将在调用 Await.result
的位置重新抛出。
如果您不想重新抛出异常,可以改用 Await.ready
。它将等待 future 的完成,并且只是 return future 本身,无论它是正常完成还是通过异常完成。然后你可以通过 Future.value
检索未来的结果
我试图使用 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]
,因此它将以 T
(Success[T]
)、 或 类型的正确结果来完成Throwable
(Failure[T]
).
另一个关键点是,当您调用 Await.result
时,您基本上是在请求通过等待未来的最终结果来阻塞当前线程,无论是正确的结果 还是异常。如果出现异常,它将在调用 Await.result
的位置重新抛出。
如果您不想重新抛出异常,可以改用 Await.ready
。它将等待 future 的完成,并且只是 return future 本身,无论它是正常完成还是通过异常完成。然后你可以通过 Future.value