【发布时间】:2016-08-03 17:58:37
【问题描述】:
我们正在公司中使用 Scala 开发一些系统,但我们有一些疑问。我们正在讨论如何映射未来的异常,我们不知道何时应该使用选项 1 或选项 2。
val created: Future[...] = ???
选项 1:
val a = created recover {
case e: database.ADBException =>
logger.error("Failed ...", e)
throw new business.ABusinessException("Failed ...", e)
}
选项 2:
val a = created recoverWith {
case e: database.ADBException =>
logger.error("Failed ...", e)
Future.failed(new business.ABusinessException("Failed ...", e))
}
有人能解释一下我应该什么时候做选项 1 或选项 2 吗?有什么区别?
【问题讨论】:
-
对于发现这个问题的其他人来说,3年后有点迂腐,一般来说“recover”和“recoverWith”的重点不是简单地将你的异常从一种类型转换为另一种类型,而是通过以不同的方式执行任务来从失败中恢复,这样你就不会再遇到失败了。在这种情况下,您对“recover”与“recoverWith”的使用取决于 new 恢复任务是发生在 Future 内部还是没有 Future。
-
@Azuaron 所以如果你只是需要转换异常,你推荐使用什么来代替
recover? stackoverflow.com/q/59099000/14955 -
不幸的是,
recover仍然是几乎唯一的选择,但重要的是要了解您正在利用什么。 -
@Thilo 有
transform来转换异常。
标签: scala error-handling future