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

Custom exception hierarchy in Scala

我一直在阅读如何在 Scala 中正确处理(OptionTryEither)和 异常。

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

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

是否有一种惯用的方式来定义这种层次结构?或者也许这个概念被吸收到完全不同的东西中?

根据回复得出的结论(请参阅下面的回答和评论)

如果您想从非叶异常中恢复,异常层次结构是有意义的。虽然,这并不妨碍您使用比传统 try/catch.

更惯用的 Option/Try/Either 机制来处理

首先回答你的问题,异常层次结构的当前实现是声明层次结构的惯用方式。此实现基本上继承自 java 编码风格。您的地图还可以参考了解更多详情。

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

现在更详细地解释它......

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

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