我很好奇为什么在下面的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 }
关于scala - Foreach/Map block 中的抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30237608/