我了解 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 组合器基本上都传递了它们成功完成的值,包装在 Success 类型中以便链中的下一个组合器进一步操作它,或者包装在 Failure 类型中的异常通常是简单地沿着链条传递。诸如recover 和recoverWith 之类的组合器旨在在失败的情况下提供某种类型的默认行为。
是否有任何示例来说明如何使“管道、链、操作......”变得更容易?有什么例子可以说明为什么我们没有 try-catch 的相同好处?
divide另外,我们为什么要回来Failure?否则,我们会有type mismatch? 这是唯一的原因吗?