@runzhliu
2017-12-28T14:02:09.000000Z
字数 966
阅读 1130
scala for
参考自《Scala 程序设计》
scala.util.Try 的结构与 Either 相似,Try 是一个 sealed 抽象类,具有两个子类,分别是 Succuss 和 Failure。前者的使用方式与 Right 类相似,它会保存正常的返回值。后者与 Left 相似,不过 Failure 总是保存 Throwable 类型的值。
// Try 的两个子类final case class Failure[+T](exception: Throwable) extends Try[T] { ... }final case class Success[+T](value: T) extends Try[T] { ... }
用 Try 的话,Scala 会将异常置于 Failure 中,好处是不需要你费心去 catch 异常,坏处是损失一些 debug 的机会。
try-catch 表达式可以利用模式匹配来捕捉你所希望捕获到的异常,相比于 Java 使用单独的 catch 字句来捕获各个异常。与 Java 相比,Scala 捕获异常的方式更紧凑、更灵活。此外 case NonFatal(ex) => ... 使用了 scala.util.control.NonFatal 来匹配所有的非致命性异常(像内存泄漏之类的就是致命异常)。最后使用 finally 可以用来确保资源得到合理的清理。
def deleteTable(tableName: String) {val admin = _conn.getAdminval tn: TableName = TableName.valueOf(tableName)if (admin.tableExists(tn)) {try {admin.disableTable(tn)} catch {case e: TableNotEnabledException => {logger.error("表已禁用")}}admin.deleteTable(tn)}}
关于什么情况用 Try 什么情况用 try-catch 会有一些有趣的讨论。不过我相信厌恶 Java 的 Scala 程序员应该会更喜欢用 Try :)
