我正在阅读与Scala中的异常处理相关的文章,并在this博客上遇到了此代码段。
def containsEven(nums: String*): Boolean = {
try {
for (i <- nums) {
if (i.toInt % 2 == 0)
return true
}
} catch { case e => () }
false
}
无论输入如何,此代码始终将 false 作为输出返回。这是在博客上给出的解释。
从上面的实现中我们可以期待containsEven(&#34; 1&#34;, &#34; 3&#34;)应该返回false并且containsEven(&#34; 2&#34;,&#34; 3&#34;)应该返回 真正。不幸的是,情况并非如此,无论输入如何 我们的方法总是返回false。这是因为在catch块我们 使用了表达式为e =&gt;的捕获Throwable的模式。 ...而不是更长但更正确的模式案例e: NumberFormatException =&gt; ...只捕获NumberFormatException。 要理解为什么这是我们需要理解的bug的原因 Scala如何从闭包中实现非本地返回。
有更多与
相关的解释非本地回报
作为一个天真的Scala程序员,我无法消化。
在这种情况下,有人可以用简单的方法帮助我理解闭包有什么问题吗?
答案 0 :(得分:2)
return
语句实际抛出,这意味着下一行执行可能不是本地的。因为case e
是不分青红皂白的,它会抓住所有扔掉的东西。现在,try
和catch
都已完成,因此执行将继续到下一行false
,然后使用该值退出def
。
将它放在适当的位置,看看你得到的各种输入。
catch { case e => println(s"caught:$e");() }
这会给你完全不同的结果。
catch { case e: NumberFormatException => println(s"caught:$e");() }