在Scala中返回finally块的值

时间:2012-12-15 14:17:57

标签: scala

  

可能重复:
  “return” and “try-catch-finally” block evaluation in scala

有两个Scala函数:

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

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

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

2 个答案:

答案 0 :(得分: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 }
  

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

def g(): Int = try { 1 } finally { 2 }
  

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


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

中的示例

答案 1 :(得分:1)

bar()的finally块的return语句退出方法栏()。因此,不会返回try块的结果。

此示例显示了方法foo()和bar()的(大致)等效版本:

object Test extends App {

    def foo() = {
      val result = { 1 }
      { 2 }
      result
    }

    def bar(): Int = {
      val result = { 1 }
      { return 2 }
      result // this line is not processed
    }

    println("foo = " + foo()) // foo = 1

    println("bar = " + bar()) // bar = 2

}