Scala 在处理异常后重新执行TRY块
从这个答案开始: 我想知道在异常处理后是否有方法重新执行整个try块(或示例代码中的ctry块) 我的意思是如果resume()操作可以将执行移动到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"
非常感谢 下面是一个愚蠢的例子,我想它会引导你找到答案:
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块中更改代码是什么意思。当程序位于类中时,是否在应用程序中动态地重新加载类定义?现在还不清楚你将如何做到这一点(或者这是否是你的意思),所以更多的细节将非常有用。