异常处理期间的Scala闭包行为

时间:2016-12-09 08:13:28

标签: scala exception closures

我正在阅读与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程序员,我无法消化。

在这种情况下,有人可以用简单的方法帮助我理解闭包有什么问题吗?

1 个答案:

答案 0 :(得分:2)

return语句实际抛出,这意味着下一行执行可能不是本地的。因为case e是不分青红皂白的,它会抓住所有扔掉的东西。现在,trycatch都已完成,因此执行将继续到下一行false,然后使用该值退出def

将它放在适当的位置,看看你得到的各种输入。

catch { case e => println(s"caught:$e");() }

这会给你完全不同的结果。

catch { case e: NumberFormatException => println(s"caught:$e");() }
相关问题