在线搜索答案给出了两个突出的帖子(Codacy和Daniel Westheide 的),并且都给出了与Scala 的 Try 官方文档相同的答案:
上面示例中显示的 Try 的一个重要属性是它能够管道或链接操作,并在此过程中捕获异常。
上面引用的例子是:
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
}
}
但是我可以使用常规try
块轻松地进行流水线操作:
def divideConventional: Int = try {
val dividend = StdIn.readLine("Enter an Int that you'd like to divide:\n").toInt
val divisor = StdIn.readLine("Enter an Int that you'd like to divide by:\n").toInt
val problem = dividend / divisor
println("Result of " + dividend + "/"+ divisor +" is: " + problem)
problem
} catch {
case (e: Throwable) =>
println("You must've divided by zero or entered something that's not an Int. Try again!")
println("Info from the exception: " + e.getMessage)
divideConventional
}
(注意:在行为divide
上divideConventional
略有不同,后者在出现问题的第一个迹象时会出错,但仅此而已。尝试输入“10a”作为输入以dividend
了解我的意思。)
我试图看到scala.util.Try
的流水线优势,但对我来说,这两种方法似乎是平等的。我错过了什么?