@runzhliu
2017-12-28T14:02:09.000000Z
字数 966
阅读 1012
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.getAdmin
val 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
:)