给定 UserService 中的一个方法:update
,这里处理错误/异常的最佳方法是什么?
选项A:
def update(...): Try[User]
这样,我需要定义我的自定义例外并在需要时将它们扔到函数体内。这些异常大多数是业务错误(例如 user_id 无法更改等)。这里的要点是,无论抛出什么异常(业务错误、网络异常、DB IO 异常等),都以相同的方式处理它们并返回一个Failure(err)
- 让上层处理它们。
选项B:
def update(...): Either[Error, User]
这是无异常的方式。在函数体中,它捕获所有可能的异常并将其转换为 Error,对于业务错误,只需返回Left[Error]
.
Using Try
对我来说似乎是一种更自然的方式,因为我想处理错误。Either
是一个更通用的东西 -Either[Error, T]
这只是一种特殊情况,我认为Try
是针对这种特殊情况而发明的。但我还读到我们应该避免使用异常进行错误处理......
那么,哪种解决方案更好,为什么?
没有灵丹妙药。
正如您已经指出的那样,Try
只是一个更专业的版本Either
,其中Left
类型固定为Throwable
.
Try
如果您需要具体化外部(可能是 java)库抛出的异常,这可能是一个不错的选择,因为它的构造函数会自动捕获它们。
另一个优点是Try
是它有map
and flatMap
,因此您可以直接在 for 推导式中使用它,而使用Either
你必须明确地预测right
案件。
不管怎样,有很多带有“右偏”的替代实现,可能还有 scalaz\/
类型是最受欢迎的一种。
话虽这么说,我通常使用\/
或几乎等价Validation
(均来自 scalaz),因为我喜欢能够返回不扩展的错误Throwable
.
它还允许更精确的错误类型,这是一个巨大的胜利。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)