加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

从scala.concurrent.Future抛出异常

发布时间:2020-12-16 18:46:00 所属栏目:安全 来源:网络整理
导读:我试图使用 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.Execut
我试图使用 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") } }

解决方法

期货不会吞下例外(至少不是通常意义上的,这意味着“捕获和丢弃”).当您在将来抛出异常时(在map / flatMap的主体中或使用Future.apply时),异常确实不会传播到当前线程中,但它将在未来保留并成为未来的结果.实际上,未来的最终结果是Try [T],因此它将以类型T(Success [T])或Throwable(Failure [T])的正确结果完成.

另一个关键点是当你调用Await.result时,你基本上要求通过等待未来的最终结果来阻止当前线程,无论是正确的结果还是异常.在异常的情况下,它将在调用Await.result时重新抛出.如果您不希望重新抛出异常,则可以使用Await.ready.无论是正常完成还是通过例外,它都会等待未来的完成并返回未来.然后,您可以通过Future.value检索未来的结果

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读