我一直在学习如何正确处理Scala中的Option
,Try
和Either
和define异常。
我的问题是: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
更惯用。
答案 0 :(得分:4)
首先回答您的问题,异常层次结构的当前实现是声明层次结构的惯用方式。此实现基本上是从Java编码样式继承的。您所映射的内容也请参考https://stackoverflow.com/a/10925402/7803797。
在我看来,在Scala中使用此类异常是个坏主意。 Scala提供了一个名为Either类型的漂亮构造,使您可以优雅地处理异常。请通过https://dzone.com/articles/catching-exceptions-in-scala-part-2
清楚地了解这一点。
现在要详细解释...
基本上,在函数式编程中,组合是一个关键方面。现在,当您尝试引发异常时,您会突然退出堆栈框架,并将代码控制权委派给调用者。拥有诸如类型为Left的Left的构造在这里派上用场,因为它不会破坏合成。您仍然在同一堆栈框架中,并优雅地退出方法。
我希望这能回答您的问题。