[关闭]
@runzhliu 2017-12-28T14:02:09.000000Z 字数 966 阅读 895

Scala Try 与 try-catch-finally

scala for


参考自《Scala 程序设计》


1 Try 类型

scala.util.Try 的结构与 Either 相似,Try 是一个 sealed 抽象类,具有两个子类,分别是 SuccussFailure。前者的使用方式与 Right 类相似,它会保存正常的返回值。后者与 Left 相似,不过 Failure 总是保存 Throwable 类型的值。

  1. // Try 的两个子类
  2. final case class Failure[+T](exception: Throwable) extends Try[T] { ... }
  3. final case class Success[+T](value: T) extends Try[T] { ... }

Try 的话,Scala 会将异常置于 Failure 中,好处是不需要你费心去 catch 异常,坏处是损失一些 debug 的机会。

2 try-catch 表达式

try-catch 表达式可以利用模式匹配来捕捉你所希望捕获到的异常,相比于 Java 使用单独的 catch 字句来捕获各个异常。与 Java 相比,Scala 捕获异常的方式更紧凑、更灵活。此外 case NonFatal(ex) => ... 使用了 scala.util.control.NonFatal 来匹配所有的非致命性异常(像内存泄漏之类的就是致命异常)。最后使用 finally 可以用来确保资源得到合理的清理。

  1. def deleteTable(tableName: String) {
  2. val admin = _conn.getAdmin
  3. val tn: TableName = TableName.valueOf(tableName)
  4. if (admin.tableExists(tn)) {
  5. try {
  6. admin.disableTable(tn)
  7. } catch {
  8. case e: TableNotEnabledException => {
  9. logger.error("表已禁用")
  10. }
  11. }
  12. admin.deleteTable(tn)
  13. }
  14. }

3 Try vs. try-catch

关于什么情况用 Try 什么情况用 try-catch 会有一些有趣的讨论。不过我相信厌恶 Java 的 Scala 程序员应该会更喜欢用 Try :)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注