Scala - 为什么我的for循环不返回?

时间:2018-02-08 00:09:07

标签: scala for-loop return

我试图用Scala执行一些重试逻辑。为了提供MRE,我用Y替换了抛出异常的对象。运行X.main时。我希望看到这个打印两条失败消息,然后是一条成功消息,但看起来return语句实际上是作为无操作,我看到3条成功消息。

我意识到这不是惯用的Scala,还有很多其他的方法可以实现这一点,但是没有办法从Scala中的for循环中返回吗?如果没有,为什么会这样?

object X {
  def main(args : Array[String]) : Unit = {

    val y = new Y()

    for ( i <- 1 to 5 ) {
      try {
        y.doSomething()
        return
      } catch {
        case e : Throwable =>
          if ( i == 5 ) {
            throw e
          }
      }
    }
  }
}

class Y {
  var counter = 0

  def doSomething() : Unit = {
    if ( counter < 2 ) {
      println("Tried to do something, but failed")
      counter += 1
      throw new RuntimeException
    }
    println("Did something")
  }
}

1 个答案:

答案 0 :(得分:4)

return比您想象的更加怪异,而不仅仅是“非惯用”。 它实际上抛出异常。您的catch子句会捕获并吞下它。这就是为什么它“充当无操作”的原因。

不要这样做。请。

但是,如果您坚持,请至少按照评论中的建议catch { case NonFatal(e) =>执行操作,以便通过return抛出的例外情况。