【发布时间】:2020-03-24 17:01:48
【问题描述】:
我一直使用recover 来转换失败期货中的异常,类似于
def selectFromDatabase(id: Long): Future[Entity] = ???
val entity = selectFromDatabase(id) recover {
case e: DatabaseException =>
logger.error("Failed ...", e)
throw new BusinessException("Failed ...", e)
}
此代码 sn-p 将 DatabaseException 转换为 BusinessException。但是,根据问题中的评论:Scala recover or recoverWith
...一般来说,“recover”和“recoverWith”的重点不是简单地将您的异常从一种类型转换为另一种类型,而是通过以不同的方式执行任务来从失败中恢复,这样您就不再失败了。
所以显然我不应该使用recover 来转换异常。转换Future异常/失败Future的正确方法是什么?
【问题讨论】:
-
如果您需要将一个失败转换为另一个失败,
recover(或稍微更好的recoverWith { .... Future.failed(new BusinessException以避免throw)很好。