我一直使用recover
来转换失败的future中的异常,就像这样
def selectFromDatabase(id: Long): Future[Entity] = ???
val entity = selectFromDatabase(id) recover {
case e: DatabaseException =>
logger.error("Failed ...", e)
throw new BusinessException("Failed ...", e)
}
这段代码片段将一个
DatabaseException
转化为一个 BusinessException
。不过,从问题的评论中可以看到:Scala recover or recoverWith
…一般来说,“recover”和“recoverWith”的重点不是简单地将异常类型转换为另一种类型,而是通过以不同的方式执行任务来从故障中恢复,以便不再出现失败。
因此,显然我不应该使用 recover
来转换异常。那么正确的方法是什么,以转换Future
异常/失败的 Future
?
recover
(或稍微好一些的是recoverWith {.... Future.failed(new BusinessException)
以避免throw
)即可。 - Thilo