给定UserService中的方法:update
,这里处理错误/异常的最佳方法是什么?
def update(...): Try[User]
通过这种方式,我需要定义自定义异常,并在需要时将它们放入函数体中。大多数这些例外都是业务错误(例如,user_id无法更改等)。这里的重点是无论抛出什么异常(业务错误,网络异常,DB IO异常等),以同样的方式对待它们,只返回Failure(err)
- 让上层处理它们。 / p>
def update(...): Either[Error, User]
这是无异常的方式。在函数体中,它捕获所有可能的异常并将其转换为Error,对于业务错误,只返回Left[Error]
。
使用Try
对我来说似乎是一种更自然的方式,因为我想处理错误。 Either
是一个更通用的东西 - Either[Error, T]
只是一个特例,我认为Try
是针对这种特殊情况发明的。但我也读到我们应该避免使用异常进行错误处理......
那么,哪种解决方案更好,为什么?
答案 0 :(得分:5)
没有银弹。
正如您已经注意到的,Try
只是Either
的更专业版,其中Left
类型固定为Throwable
。
Try
可能是合适的,因为它的构造函数会自动捕获它们。
Try
的另一个优点是它有map
和flatMap
,因此您可以直接在for-comprehensions中使用它,而使用Either
则必须明确关于right
案例的项目。
无论如何,有很多替代实现与#34;右偏 - ",可能scalaz \/
类型是最受欢迎的。
话虽如此,我通常使用\/
或几乎等效的Validation
(均来自scalaz),因为我希望能够返回不扩展Throwable
的错误。< / p>
它还允许更精确的错误类型,这是一个巨大的胜利。