在Scala中返回finally块的值

卢声远*_* Lu 3 scala

可能重复:
scala中的"return"和"try-catch-finally"块评估

有两个Scala函数:

一个): def foo(): Int = try { 1 } finally { 2 }

B): def bar(): Int = try { return 1 } finally { return 2}

我无法弄清楚为什么foo返回1但bar返回2.

Ale*_*rov 10

M.Odersky,L.Spoon和B.Venners在"Scala编程"中解释了这种行为.我有第一版,第7.5节(第128页)说:

值得注意的是,Scala的行为与Java不同,因为Java try-finally不会产生价值.与在Java中一样,如果finally子句包含显式返回语句或抛出异常,则该返回值或异常将"覆盖"源自try块或其catch子句之一的任何前一个.例如,给定:

def f(): Int = try { return 1 } finally { return 2 }
Run Code Online (Sandbox Code Playgroud)

调用f()导致2.相反,给出:

def g(): Int = try { 1 } finally { 2 }
Run Code Online (Sandbox Code Playgroud)

调用g()导致1.这两个函数都表现出可能让大多数程序员感到惊讶的行为,因此通常最好避免从finally子句返回值.


Scala标准库具有scala.util.control.ExceptionAPI,可提供用于处理异常的小型函数库.请参阅scaladoc中的示例

  • 我是在阅读了 Odersky 的那部分之后来到这里的。不幸的是,这个答案并没有真正解释这种行为。我不明白为什么 finally 块(函数中执行的最后一个代码)不提供 `foo` 的返回值。 (2认同)