scala - Future.successful(Failure(Exception)) 与 Future.failed()

标签 scala exception future

我试图理解为什么有人会使用 Future.successful(Failure(ServiceException("error"))) 而不是 Future.failed(ex)在 Scala 中。

Future.successful(
  Failure(
    ServiceException(ErrorTypes.Validation, "Value should not be more than 30")
  )
)

最佳答案

很难说作者为什么这样做,我可以猜测几个原因:

  1. 他们不知道您可以通过 Future.fail 返回失败的 future。发生这种情况可能是因为 future 的签名没有在类型中明确传达失败路径。当您看到 Future[A] 时,您可能会认为此计算将来一定会成功

  2. 他们想明确指出失败。当我声明 Future[Try[A]] 时,我迫使调用者处理无法直接访问 A 的事实,但必须“跳转另一跳” "进入A。尽管这很微妙,但人们可以轻松地写出:

     val f: Future[Try[String]] = ???
     f.map(_.map(str => // stuff with string))
    

    但也许签名会迫使调用者意识到失败的可能性。尽管 Try 的表达能力也受到很大限制,因为它只能在失败路径上返回一个 Throwable 。我发现 Future[Either[E, A]] 在这方面更具表现力,它允许您构建自己的故障层次结构并将其编码在类型中。

关于一元仿函数 IO 类型 (Future[A]) 与双仿函数 IO 类型 (IO[E, A],即 ZIO )。我赞成双仿函数并且最近才使用它,我发现当我不必深入研究实现来了解计算可能出现的失败时,它真的很节省时间。

关于scala - Future.successful(Failure(Exception)) 与 Future.failed(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65801013/

相关文章:

c# - 什么是后置条件异常?

java - Scala 与 Java 方法调用

string - Scala 如何转义 3 个双引号

Scala: "override protected val"在定义案例类构造函数时导致错误

Java Android 如何在Exception 中获取HTTPUrlConnection (POST) 响应代码和消息?

java - 使用 throw 语句实现 try-catch block

flutter - FutureBuilder 不断更新

c++ - 为什么不捕获 `std::promise::~promise` 中已经传播的异常

scala - 是否有任何理由制作 Future[Try[A]] 类型的 API 而不是 Future[A]?

Java 并发 : How can I tell which Future belongs to which Callable during processing?