第 7 章 异常
作为一门比较优秀的语言, 异常处理肯定是少不了的.
Scala 的异常处理机制比 Java 改进了一些, 至少没有 Java 的异常处理机制那么令人讨厌. 比如去掉了令人生厌的受检异常
object Test {
def main(args: Array[String]): Unit = {
try {
var n = 10 / 0
} catch {
case ex: ArithmeticException => println("发生算术异常")
case ex: Exception => println("发生了异常1")
} finally {
println("finally")
}
println("异常处理结束")
}
}
我们将可疑代码封装在
try
块中。在try
块之后使用了一个catch
处理程序来捕获异常。如果发生任何异常,catch
处理程序将处理它,程序将不会异常终止Scala 的异常的工作机制和 Java 一样,但是 Scala 没有“checked(编译期)”异常,即 Scala 没有编译异常这个概念,异常都是在运行的时候捕获处理
用 throw 关键字, 抛出一个异常对象. 所有异常都是 Throwable 的子类型. throw 表达式是有类型的, 就是 Nothing, 因为 Nothing 是所有类型的子类型, 所以throw 表达式可以用在需要类型的地方
def test(): Nothing = { throw new Exception("不对") }
在Scala里,借用了模式匹配的思想来做异常的匹配,因此,在catch的代码里,是一系列case子句来匹配异常。【前面案例可以看出这个特点, 模式匹配我们后面详解】
异常捕捉的机制与其他语言中一样,如果有异常发生,catch 子句是按次序捕捉的。因此,在 catch 子句中,越具体的异常越要靠前,越普遍的异常越靠后,如果把越普遍的异常写在前,把具体的异常写在后,在 scala 中也不会报错,但这样是非常不好的编程风格
finally 子句用于执行不管是正常处理还是有异常发生时都需要执行的步骤,一般用于对象的清理工作,这点和 Java 一样
Scala 提供了 throws 关键字来声明异常,可以使用 throws 注解来声明异常
object Test { def main(args: Array[String]): Unit = { f11() } @throws(classOf[NumberFormatException]) def f11() = { "abc".toInt } }