有两个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中的示例