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

Should I use Try as return type in Scala services?

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

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

我也有这个服务的相应实现。

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

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

即我应该使用以下声明:

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

这取决于服务产生的错误对消费者是否有意义。 IE。他们是否希望了解不同的数据库故障并可能重试?还是将异常映射到对消费者有意义的实例?在这两种情况下,我都会使用 Try[Person]

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

或者,如果您确实想传达一些信息来区分失败和没有上升到异常级别的空,请考虑使用 Either[FailureReason,Person]

您有 4 个标准选项:

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

  2. TryTry 向消费者发出操作可能失败的信号,他们应该准备好处理异常。

  3. Either:您可以在此处使用类似于 TryEither,但具有更多自定义错误信息(例如 Either[ErrorType, ReturnType])。

  4. Option:这里最简单的选项是Option,忽略错误的原因,只有return Some如果操作那是成功的。