【发布时间】:2014-07-28 12:13:15
【问题描述】:
所以我正在学习函数式 Scala,书上说异常会破坏引用透明度,因此应该使用 Option,如下所示:
def pattern(s: String): Option[Pattern] = {
try {
Some(Pattern.compile(s))
} catch {
case e: PatternSyntaxException => None
}
}
这看起来很糟糕;我的意思是它似乎等同于:
catch(Exception e){
return null;
}
除了我们可以区分“null for error”和“null as真值”这一事实。似乎它至少应该返回包含错误信息的内容,例如:
catch {
case e: Exception => Fail(e)
}
我错过了什么?
【问题讨论】:
-
哪本书?我看不出异常会如何破坏参照透明度。在 Scala 中,
Nothing是一种类型(尽管很特殊)。如果您的函数在给定的常量参数上始终抛出异常,那在我的理解中是透明的。 -
@0__: 这本书是manning.com/bjarnason "throw and catch 意味着如果我们用 throw new 替换 x + y 中的 x Exception("fail!") + y,我们的程序有不同的结果"
-
嗯,我认为他来自讨厌分类型的学校。在 Scala 中,
Nothing是底部类型,所以我不会称它为“不同的结果”。无论如何,如果您想直接在调用端处理错误,那么使用Try或Either等不同的机制可能会更有用。 -
对于异常抛出的怪异控制流,有几种代数替代方案,
Option只是您对错误详细信息不感兴趣时使用的替代方案。这本书可能首先介绍了这个,因为它是最简单的。
标签: scala exception-handling functional-programming