我很好奇为什么在以下foreach
块中引发了异常。我希望没有值能够通过过滤器,因此foreach
永远不会到达该块。也会发生相同的行为map
。
scala> (1 to 10) filter { _ > 12 } foreach { throw new Exception }
java.lang.Exception
... 33 elided
我希望不会抛出异常,并且行为更像以下println
从未执行过的异常。
scala> (1 to 10) filter { _ > 12 } foreach { println _ }
也许这与异常处理方式有关?为什么是这样?
{ throw new Exception }
只是一个引发异常的块-因此它具有类型Nothing
。由于Nothing
是所有类型的子类型,因此与Function[Int, T]
作为foreach
块参数的要求兼容。
如果事先创建函数,则可以更清楚地看到以下内容:
//throws exception
val f: Function[Int, Unit] = { throw new Exception }
如果要创建一个Function[Int, Nothing]
,则需要将参数添加到块中:
(1 to 10) filter { _ > 12 } foreach { _ => throw new Exception }
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句