我在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]]
}
答案 0 :(得分:4)
这取决于服务产生的错误是否对消费者有意义。即他们是否应该知道不同的数据库故障并可能重试?或者您是否将例外映射到消费者有意义的实例?在这两种情况下,我都会使用Try[Person]
如果您最终都记录了错误并且您只是想避免,我建议您登录PersonService并返回Option[Persons]
。
或者,如果您确实希望传达某些信息以区分失败与未达到异常级别的空白,请考虑使用Either[FailureReason,Person]
答案 1 :(得分:1)
您有4个标准选项:
Future
:这可能是最惯用和最灵活的,允许消费者更容易地异步使用服务并处理错误(通过与Failure
匹配)。
Try
:Try
向消费者发出信号,表明操作可能会失败,并且他们应该准备好处理其例外情况。
Either
:您可以在Either
处使用Try
,但可以使用更多自定义错误信息(例如Either[ErrorType, ReturnType]
)。
Option
:此处最简单的选项是Option
,您可以忽略错误原因,只有在操作成功时才返回Some
。