Scala中的自定义异常层次结构

时间:2019-03-25 18:29:54

标签: scala exception custom-exceptions

我一直在学习如何正确处理Scala中的OptionTryEitherdefine异常。

我的问题是:Scala中的异常层次结构有意义吗?例如,我们目前有一个Scala项目,实现了以下内容:

class ServiceException(msg: String) extends Exception(msg)
class StorageServiceException(msg: String) extends ServiceException(msg)
class StorageServiceNotAvailableException(msg: String)
  extends StorageServiceException(msg)

是否有惯用的方式定义这种层次结构?还是这个概念被完全吸收了?

结论中的结论(请参见下面的答案和评论)

如果要从非叶异常中恢复,则异常层次结构是有意义的。虽然,但这不会阻止您使用Option/Try/Either机制进行处理,该机制比传统的try/catch更惯用。

1 个答案:

答案 0 :(得分:4)

首先回答您的问题,异常层次结构的当前实现是声明层次结构的惯用方式。此实现基本上是从Java编码样式继承的。您所映射的内容也请参考https://stackoverflow.com/a/10925402/7803797

在我看来,在Scala中使用此类异常是个坏主意。 Scala提供了一个名为Either类型的漂亮构造,使您可以优雅地处理异常。请通过https://dzone.com/articles/catching-exceptions-in-scala-part-2清楚地了解这一点。

现在要详细解释...

基本上,在函数式编程中,组合是一个关键方面。现在,当您尝试引发异常时,您会突然退出堆栈框架,并将代码控制权委派给调用者。拥有诸如类型为Left的Left的构造在这里派上用场,因为它不会破坏合成。您仍然在同一堆栈框架中,并优雅地退出方法。

我希望这能回答您的问题。