2015-04-22 25 views
2

我就像在Java中创建Scala的服务:我应该在Scala服务中使用Try作为返回类型吗?

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

而且我也相应的执行这项服务。

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

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

I.e.我应该使用以下声明:

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

是的。或“未来”。 –

回答

4

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

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

另外,如果你想传达一些信息,以从空辨别故障,不上升到异常水平,考虑使用Either[FailureReason,Person]

1

你有4种标准选择:

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

  2. Try:A Try向消费者表明操作可能失败,并且他们应该准备好处理其例外情况。

  3. Either:您可以使用Either类似于一个Try这里,但更多的自定义的错误信息(例如Either[ErrorType, ReturnType])。

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

+1

考虑到与一个(“慢”)数据库层的交互,“未来”涵盖了所有的基础。 – millhouse

+1

仅在数据库层具有异步访问模式的情况下。否则,在将来封装类似JDBC的阻塞响应只会捆绑另一个线程 –

相关问题