当遇到不能转成Int的字符串,给与一个默认值即可。
scala> import scala.util.Try import scala.util.Try scala> "12".toInt res17: Int = 12 scala> "asd".toInt java.lang.NumberFormatException: For input string: "asd" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:272) at scala.collection.immutable.StringOps.toInt(StringOps.scala:29) ... 32 elided scala> Try("asd".toInt).getOrElse(-1) res19: Int = -1但这里还是得多说一句,这种做法会忽略掉原本应该抛出的错误,你需要明确知道自己确实是要忽略掉这个错误才能这样用。
否则可能因为设置的默认值导致出现问题,而毫无头绪,因为程序并没有报任何错误!!
3.3 模式匹配我们可以不必如java的try catch那般去处理Try失败时返回的异常。因为我们有scala的模式匹配。
不得不说,模式匹配真的是很强大的一个语言特性。前面不是说到嘛,Try有两个子类,Success和Failure,成功时候返回Success,失败时返回Failure。
所以我们就能够这样做:
import scala.util.Success import scala.util.Failure val operation = Try(1 / 0) operation match { case Success(num) => println(num) case Failure(ex) => println(s"Problem is ${ex.getMessage}") }因为除数为0,所以这个Try是失败的,所以这里会输出:Problem is / by zero
scala强大的模式匹配,可以方便得让我们处理错误和非错误的情况。
4. 小结Scala 的错误处理和其他范式的编程语言有很大的不同。 Try 类型可以让你将可能会出错的计算封装在一个容器里,并优雅的去处理计算得到的值。 并且可以像操作集合和 Option 那样统一的去操作 Try。
同时Try[A]也支持常见数据结构中的操作,诸如Map,Filter等常规的api都支持。
Try这种错误处理的方式,明显更适用于函数式的情况,也就是说更适合在并发编程的时候使用。
但在我看来,Try也是有一些不好的地方,比如说在代码可读性方面就比try catch这种方式差。不得不说,虽然写起来比较啰嗦,但看着这个结构确实是一目了然。
但是不管如何,在我看来,函数式的错误处理依旧是很有趣的一个东西。如果合适的话,可以多在代码中尝试去使用:)