我应该在Scala服务中使用Try as return类型吗?

时间:2015-04-22 23:24:49

标签: scala service-layer

我在Scala中创建服务就像在Java中一样:

trait PersonService {
  def getById(id: Long): Person 
  def getAll: Iterable[Person]
}

我也有相应的服务实现。

实际上,此服务与DB层交互并执行一些业务逻辑。所以这种方法可以抛出异常。

所以我有一个问题:我应该用Try包装返回类型的服务方法吗?

即。我应该使用以下声明:

trait PersonService {
  def getById(id: Long): Try[Person] 
  def getAll: Try[Iterable[Person]]
}

2 个答案:

答案 0 :(得分:4)

这取决于服务产生的错误是否对消费者有意义。即他们是否应该知道不同的数据库故障并可能重试?或者您是否将例外映射到消费者有意义的实例?在这两种情况下,我都会使用Try[Person]

如果您最终都记录了错误并且您只是想避免,我建议您登录PersonService并返回Option[Persons]

或者,如果您确实希望传达某些信息以区分失败与未达到异常级别的空白,请考虑使用Either[FailureReason,Person]

答案 1 :(得分:1)

您有4个标准选项:

  1. Future:这可能是最惯用和最灵活的,允许消费者更容易地异步使用服务并处理错误(通过与Failure匹配)。

  2. TryTry向消费者发出信号,表明操作可能会失败,并且他们应该准备好处理其例外情况。

  3. Either:您可以在Either处使用Try,但可以使用更多自定义错误信息(例如Either[ErrorType, ReturnType])。

  4. Option:此处最简单的选项是Option,您可以忽略错误原因,只有在操作成功时才​​返回Some