当前位置: 首页 > 知识库问答 >
问题:

映射失败未来的例外

谭奕
2023-03-14

在scala中映射失败未来的例外的最干净的方法是什么?

说我有:

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

val f = Future { 
  if(math.random < 0.5) 1 else throw new Exception("Oh no") 
}

如果未来以1成功,我想保留它,但是如果它失败了,我想将异常更改为其他异常

我能想出的最好的是转换,但是这需要我为成功案例做一个不必要的函数:

val f2 = f.transform(s => s, cause => new Exception("Something went wrong", cause))

有什么原因没有< code > mapFailure(partial function[Throwable,Throwable])?

共有2个答案

陈茂
2023-03-14

您可以尝试恢复与如下所示:

f recoverWith{
  case ex:Exception => Future.failed(new Exception("foo", ex))
}
西门鹏程
2023-03-14

还有:

f recover { case cause => throw new Exception("Something went wrong", cause) }

从Scala 2.12开始你可以做:

f transform {
  case s @ Success(_) => s
  case Failure(cause) => Failure(new Exception("Something went wrong", cause))
}

f transform { _.transform(Success(_), cause => Failure(new Exception("Something went wrong", cause)))}
 类似资料:
  • 我刚开始冬眠,尝试一些应该很容易的事情,但我无法让它工作。 有两个表,一个人和一个地址。一个人可以有一个或多个地址,即:一个OneTo多映射。当我试图向两个不同的人添加相同的地址时,我会遇到异常。这几乎就像Unique在连接表的foriegn_key上被强制执行一样。 我的源代码: 人 地址 主要 代码在保存Person对象Harry时崩溃。这是因为在个人地址表中,引用“1”的地址已经存在并分配给

  • 我在Spring启动时使用推土机映射器。如果我将数据从实体映射到EntityDTO,那么dozer maper的工作就是将数据从实体类复制到EntityDTO,对于原语也是如此。但是假设我有这样一门课 和名称为EntityDTO的DTO 那么它不会将数据从entityChild映射到EntityChildTos,有人能帮我解决这个问题吗?

  • 在Scala中,未来可能会失败,这可以异步发现: 你将如何“翻译”成Clojure?我的阅读让我相信Clojure未来/promise模型没有Scala的强大,你不能就这样抓住失败。那么该怎么办呢? Scala的未来永远不需要被问到它的价值——当它好并准备好时,它会告诉你发生了什么(包括它是否失败——这是这个问题的关键)。这就是我所说的“异步”的意思。Scala的未来可以处于三种可能的状态之一——

  • 前端将这个json发送到我的API 控制器:

  • 我使用一个VanillaChroncile临时存储和检索条目,除了有巨大的负载外,它工作得非常好。我得到地图失败异常。虽然我有处理此异常的恢复逻辑,但我想知道为什么首先会出现此异常。任何帮助都将不胜感激。 }

  • 我在映射时遇到一个问题: 马达。Java 查询“from motor”是一个classname。但它仍然不起作用。如何按id vnopol查询?