【问题标题】:Should I use Try as return type in Scala services?我应该在 Scala 服务中使用 Try 作为返回类型吗?
【发布时间】:2015-04-22 23:24:48
【问题描述】:

我在 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]]
}

【问题讨论】:

    标签: scala service-layer


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您有 4 个标准选项:

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

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

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

      4. Option:这里最简单的选项是Option,您可以忽略错误原因,仅在操作成功时返回Some

      【讨论】:

      • 鉴于与(“慢”)数据库层的交互,Future 涵盖了所有基础。
      • 仅当 DB 层具有异步访问模式时。否则,将来包装诸如 JDBC 之类的阻塞响应只会占用另一个线程
      猜你喜欢
      • 2020-07-19
      • 2010-09-12
      • 2021-06-19
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 2013-04-16
      相关资源
      最近更新 更多