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

在Scala中返回Future.failed(new Exception(“”))时继续

发布时间:2020-12-16 19:18:35 所属栏目:安全 来源:网络整理
导读:如果未来返回失败的异常,我该如何处理? 场景是我的代码调用getValue(),将结果映射到verifyValue(),然后我希望能够处理getValue()的结果是Future.failed(new Exception(“message”))的情况.但是当我运行它时,如果getValue()的结果是失败的未来,它只会抛出异
如果未来返回失败的异常,我该如何处理?

场景是我的代码调用getValue(),将结果映射到verifyValue(),然后我希望能够处理getValue()的结果是Future.failed(new Exception(“message”))的情况.但是当我运行它时,如果getValue()的结果是失败的未来,它只会抛出异常而不是处理异常.

有没有人对我怎么做这个有什么建议?

def method(): Future[JsObject] = {
    getValue().flatMap(verifyValue(_))
}

def getValue(): Future[JsObject] = {
    try {
        value1 <- getValue1()
        value2 <- getValue2(value1)
    } yield {
        value2
    }
}

def verifyValue(result: Any): Future[JsObject] = {
  result match {
    case e: Exception =>
      getValue()
    case json: JsObject => Future.successful(json)
  }
}

更新:
我不认为我用原始问题清楚地说明了这一点,但我为什么平面化这个值的原因是我不想明确地等待代码中的任何期货,因此我不想要使用Future.onComplete {}来解析值.

更新2:
另一件可能不太清楚的事情是,如果它抛出一个异常,我想调用另一个方法.我不希望它只是处理异常,它将记录异常,然后调用另一个返回值与getValue()类型相同的方法.

解决方法

使用recover或recoverWith

当future将来因异常而失败时,将调用recover或recoverWith.在恢复块中,您可以提供替代值.

recoverWith不同于恢复需要未来的东西

getValue().recover { case th =>
  //based on the exception type do something here
  defaultValue //returning some default value on failure
}

(编辑:李大同)

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

    推荐文章
      热点阅读