【发布时间】:2018-05-06 15:13:52
【问题描述】:
我了解 Try/Success/Failure 与 Try Catch 之间存在差异。官方文档也有一个很好的例子:
import scala.io.StdIn
import scala.util.{Try, Success, Failure}
def divide: Try[Int] = {
val dividend = Try(StdIn.readLine("Enter an Int that you'd like to divide:\n").toInt)
val divisor = Try(StdIn.readLine("Enter an Int that you'd like to divide by:\n").toInt)
val problem = dividend.flatMap(x => divisor.map(y => x/y))
problem match {
case Success(v) =>
println("Result of " + dividend.get + "/"+ divisor.get +" is: " + v)
Success(v)
case Failure(e) =>
println("You must've divided by zero or entered something that's not an Int. Try again!")
println("Info from the exception: " + e.getMessage)
divide <------------ Here!
}
}
但是,我理解起来有困难
上面示例中显示的 Try 的一个重要属性是它的能力 管道或链操作,沿途捕获异常。 上面例子中的 flatMap 和 map 组合器本质上都是 传递他们成功完成的价值,包裹在 由下一个组合器进一步操作的成功类型 在链中,或者包裹在 Failure 类型中的异常通常会 可以简单地沿着链条传递。组合器,如恢复和 recoverWith 旨在提供某种类型的默认行为 失败的案例。
是否有任何示例可以说明如何使“管道、链、操作......”变得更容易?有什么例子可以说明为什么我们没有 try-catch 的相同好处?
另外,为什么我们在Failure 中返回divide?否则,我们会有type mismatch?这是唯一的原因吗?
【问题讨论】: