Scala错误处理:尝试还是要么?

时间:2014-11-27 12:50:09

标签: scala error-handling

给定UserService中的方法:update,这里处理错误/异常的最佳方法是什么?

选项A:

def update(...): Try[User]

通过这种方式,我需要定义自定义异常,并在需要时将它们放入函数体中。大多数这些例外都是业务错误(例如,user_id无法更改等)。这里的重点是无论抛出什么异常(业务错误,网络异常,DB IO异常等),以同样的方式对待它们,只返回Failure(err) - 让上层处理它们。 / p>

选项B:

def update(...): Either[Error, User]

这是无异常的方式。在函数体中,它捕获所有可能的异常并将其转换为Error,对于业务错误,只返回Left[Error]

使用Try对我来说似乎是一种更自然的方式,因为我想处理错误。 Either是一个更通用的东西 - Either[Error, T]只是一个特例,我认为Try是针对这种特殊情况发明的。但我也读到我们应该避免使用异常进行错误处理......

那么,哪种解决方案更好,为什么?

1 个答案:

答案 0 :(得分:5)

没有银弹。

正如您已经注意到的,Try只是Either的更专业版,其中Left类型固定为Throwable

如果你需要实现外部(也许是java)库抛出的异常,那么

Try可能是合适的,因为它的构造函数会自动捕获它们。

Try的另一个优点是它有mapflatMap,因此您可以直接在for-comprehensions中使用它,而使用Either则必须明确关于right案例的项目。 无论如何,有很多替代实现与#34;右偏 - ",可能scalaz \/类型是最受欢迎的。

话虽如此,我通常使用\/或几乎等效的Validation(均来自scalaz),因为我希望能够返回不扩展Throwable的错误。< / p>

它还允许更精确的错误类型,这是一个巨大的胜利。