【发布时间】:2015-01-26 01:59:54
【问题描述】:
给定 UserService 中的一个方法:update,这里处理错误/异常的最佳方法是什么?
选项 A:
def update(...): Try[User]
这样,我需要定义我的自定义异常,并在需要时将它们扔到函数体中。这些异常中的大多数是业务错误(例如 user_id 无法更改等)。这里的重点是无论抛出什么异常(业务错误、网络异常、DB IO 异常等),都以同样的方式对待它们,只返回一个Failure(err) - 让上层处理它们。
选项 B:
def update(...): Either[Error, User]
这是无异常的方式。在函数体中它会捕获所有可能的异常并将它们转换为错误,对于业务错误只需返回Left[Error]。
使用Try 对我来说似乎是一种更自然的方式,因为我想处理错误。 Either 是一个更通用的东西 - Either[Error, T] 只是一个特殊情况,我认为 Try 是为这种特殊情况发明的。但我也读到我们应该避免使用异常来处理错误......
那么,哪种解决方案更好,为什么?
【问题讨论】:
-
我更喜欢
Either,因为它允许您明确指出哪些错误类型是可能的,而不是使用Try得到的通用Throwable。正如@Gabriele 所说,我更喜欢scalaz\/,因为它有一个更有用的map构造。
标签: scala error-handling