scala - Foreach/Map block 中的抛出异常

标签 scala

我很好奇为什么在下面的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/

相关文章:

scala - 在scala模式匹配中,可变模式可疑的阴影是什么?

java - docker-grafana-graphite 中的 Kamon JVM 和操作系统指标

scala - 将 Logback 中的应用程序日志与 log4j 中的 Spark 日志分开

sockets - Akka IO.TCP 与 Json

scala - 如何正确地对这个 HList 进行类型注释?

scala - 如何使用 Scala Stream 类读取大型 CSV 文件?

scala - 在 Scala 中添加两个包含简单元素的元组

scala 的 spire 框架 : I am unable to operate on a group

scala - 如何在 Scala 中捕获进程的输出

scala - 早期初始化程序 `new {} with SomeTrait` 失败