我试图重现这个问题如何获得Scala Future中抛出的异常?使用scala.concurrent.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") } }
Run Code Online (Sandbox Code Playgroud)
Rég*_*les 22
期货不会吞下例外(至少不是通常意义上的,这意味着"捕获和丢弃").当您在将来抛出异常时(在map/ flatMap或正在使用时Future.apply),异常确实不会传播到当前线程中,但它将在未来保留并成为未来的结果.事实上,未来的最终结果是Try[T],所以它会完成两种类型的正确的结果T(一Success[T]),或有Throwable(Failure[T]).
另一个关键点是,当你打电话时,Await.result你基本上要求通过等待未来的最终结果来阻止当前线程,无论是正确的结果还是异常.在异常的情况下,它将在Await.result被调用的点重新抛出.如果您不希望重新抛出异常,则可以Await.ready改为使用.无论是正常完成还是通过例外,它都会等待未来的完成并返回未来.然后你可以通过检索未来的结果Future.value