gpt4 book ai didi

scala - 为什么在 Try.recover 中抛出的异常不会中断执行流程?

转载 作者:行者123 更新时间:2023-12-04 02:43:43 29 4
gpt4 key购买 nike

我写了两个函数来说明我的困惑:

import scala.util.Try

def TryRecover: Unit = {
Try {
throw new Exception()
}.recover {
case e: Exception => {
println("caught error")
throw e
}
}

println("got to the end of TryRecover")
}

def tryCatch: Unit = {
try {
throw new Exception()
} catch {
case e: Exception => {
println("caught error")
throw e
}
}

println("got to the end of tryCatch")
}

TryRecover
tryCatch

这是输出:

caught error
got to the end of TryRecover
caught error
java.lang.Exception at .tryCatch(<console>:13) ... 30 elided

我没想到会打印“到达 TryRecover 的结尾”。为什么 throw e in .recover 不会中断执行流程?

最佳答案

Try.recover在另一个 try-catch

中执行传入的部分函数参数 pf
  def recover[U >: T](pf: PartialFunction[Throwable, U]): Try[U] = {
val marker = Statics.pfMarker
try {
val v = pf.applyOrElse(exception, (x: Throwable) => marker)
if (marker ne v.asInstanceOf[AnyRef]) Success(v.asInstanceOf[U]) else this
} catch { case NonFatal(e) => Failure(e) }
}

所以因为 epf 重新抛出

{ case e: Exception => println("caught error"); throw e }

recover 评估为 Failure 值,这只是一个常规的一等值,也就是说,执行流程没有中断。事实上,我们可以说 Try 的主要目的是将不安全的异常提升为常规值,这样我们就不会异常崩溃程序。

关于scala - 为什么在 Try.recover 中抛出的异常不会中断执行流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58104015/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com