在Foreach / Map块中抛出异常

时间:2015-05-14 12:37:51

标签: 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 _ }

也许这与如何处理异常有关?这是为什么?

1 个答案:

答案 0 :(得分:7)

{ 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 } ,则需要将参数添加到块中:

$find = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$lang = substr($find,0,2);
if ($lang == "fr") {
  header("Location: download.com/file_fr");
  exit();
} elseif ($lang == "it") {
  header("Location: download.com/file_it");
  exit();
} elseif ($lang == "xx") {
  header("Location: download.com/file_xx");
  exit();
} else {
  header("Location: download.com/file");
  exit();
}