我非常好奇为什么在以下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 _ }
也许这与如何处理异常有关?这是为什么?
答案 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();
}