Scala 在处理异常后重新执行TRY块

Scala 在处理异常后重新执行TRY块,scala,exception-handling,continuations,Scala,Exception Handling,Continuations,从这个答案开始: 我想知道在异常处理后是否有方法重新执行整个try块(或示例代码中的ctry块) 我的意思是如果resume()操作可以将执行移动到try块的第一条语句,而不是简单地从引发异常的语句恢复执行 非常感谢 下面是一个愚蠢的例子,我想它会引导你找到答案: object Retry object SO_7331489 extends App { import scala.util.continuations._ var dividend: String = "ten"

从这个答案开始:

我想知道在异常处理后是否有方法重新执行整个try块(或示例代码中的ctry块)

我的意思是如果resume()操作可以将执行移动到try块的第一条语句,而不是简单地从引发异常的语句恢复执行


非常感谢

下面是一个愚蠢的例子,我想它会引导你找到答案:

object Retry

object SO_7331489 extends App {

  import scala.util.continuations._

  var dividend: String = "ten"
  var divisor: Int = 0

  val quotient = reset {

    shift { k: (Unit => Any) =>
      def retry: Any =
        k() match {
          case Retry => retry
          case x     => x
        }
      retry
    }

    try {
      dividend.toInt / divisor
    } catch {
      case e: java.lang.NumberFormatException =>
        println("caught " + e.getClass.getName + "(" + e.getMessage + ")")
        dividend = "10"
        println("retrying with dividend = \"10\"")
        Retry
      case e: java.lang.ArithmeticException =>
        println("caught " + e.getClass.getName + "(" + e.getMessage + ")")
        divisor = 2
        println("retrying with divisor = 2")
        Retry
      case t: Throwable =>
        println("caught " + t.getClass.getName + "(" + t.getMessage + ")")
        // Nothing left to retry, so don't return Retry
    }

  }

  println("quotient: " + quotient)

}
想法是在
try/catch
块之前触发
shift
块。在
catch
块中,如果要重试整个过程,只需返回
retry
对象即可

将整个
shift
块拉出到一个简单的函数中(例如
retry
)可能会很好,但为了清晰起见,我将其保留为内联

此代码生成以下输出:

[info] Running SO_7331489 
caught java.lang.NumberFormatException(For input string: "ten")
retrying with dividend = "10"
caught java.lang.ArithmeticException(/ by zero)
retrying with divisor = 2
quotient: 5

我想这叫做“循环”。好的,下一个问题。假设try块引发异常。在catch块中,我更改try块中的代码(使用字节码或重新编译的源代码)。有办法重新执行新的try块吗?@Niko-我不明白你在catch块中更改代码是什么意思。当程序位于类中时,是否在应用程序中动态地重新加载类定义?现在还不清楚你将如何做到这一点(或者这是否是你的意思),所以更多的细节将非常有用。