Try.recover
выполняет переданный в частичном аргументе функции pf
внутри другого try-catch
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) }
}
, так как e
перебрасывается pf
{ case e: Exception => println("caught error"); throw e }
recover
оценивается как значение Failure
, которое является просто обычным значением первого класса, то есть поток выполнения не прерывается.Фактически, мы могли бы сказать, что основная цель Try
состоит в том, чтобы поднять небезопасные исключения в обычные значения, чтобы мы не исключали аварийное завершение программы.