gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:28:44 26 4
gpt4 key购买 nike

我试图理解为什么有人会使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com