Scala 使用“try … catch … finally”来处理异常
try块:用于包含可能出错的代码
catch处理程序:用于处理 try 块中发生的异常
finally块:不管有没有捕获异常,最终都会执行的代码

Java(回顾)

  1. public class ExceptionOperation {
  2. public static void main(String[] args) {
  3. try {
  4. int i = 1 / 0;
  5. System.out.println(i);
  6. } catch(ArithmeticException e) { // (1)
  7. e.printStackTrace();
  8. } catch(Exception e) { // (2)
  9. System.out.println("捕获到异常");
  10. } finally {
  11. System.out.println("finally!!!");
  12. }
  13. }
  14. }

✍ 思考题
问:当调换代码中(1)和(2)的位置,执行代码后的结果会是什么?密码:123


📝 说明

  • 按照 “try-catch-catch…-finally”的方式处理异常
  • 不管有没有异常捕获,finally 代码块最终都会执行;一般用于释放资源
  • 可以有多个 catch 块,范围小的异常类写在前面,范围大的写在后面,否则编译错误

    Scala

    捕获异常

    1. object ExceptionOperation {
    2. def main(args: Array[String]): Unit = {
    3. catchException()
    4. }
    5. def catchException(): Unit = {
    6. try {
    7. val res = 1 / 0
    8. } catch {
    9. case ex: ArithmeticException => println("捕获了除数为0的算数异常") // (1)
    10. case ex: Exception => println("捕获了异常") // (2)
    11. } finally {
    12. println("finally!!!")
    13. }
    14. }
    15. }

    ✍ 思考题
    问:当调换代码中(1)和(2)的位置,执行代码后的结果会是什么?密码:123


📝 说明

  • Scala 的异常工作机制和 Java 一样,但是 Scala 没有“checked(编译时)”异常,异常都是在运行时捕获的
  • 在 Scala 的 catch 处理程序中,借用了模式匹配的思想来对异常进行匹配
  • Scala 的异常捕获机制是按 catch 子句的次序捕捉的,所以具体的异常要放在前面,普遍的放在后面
  • catch 子句中范围广的异常放在范围小的前面不会像 Java 一样报错,但是这种编程风格不好,不要这么做

    抛出异常

    1. object ExceptionOperation {
    2. def main(args: Array[String]): Unit = {
    3. throwException1()
    4. throwException2()
    5. }
    6. // 方式一
    7. def throwException1(): Nothing = {
    8. throw new ArithmeticException("算数异常~")
    9. }
    10. // 方式二
    11. // classOf[NumberFormatException] 等同于 Java 中的 NumberFormatException.class
    12. @throws(classOf[NumberFormatException])
    13. def throwException2()= {
    14. "abc".toInt
    15. }
    16. }

    📝 说明

  • Scala 可以使用两种方式抛出异常:通过 throw 关键字抛出异常或者使用 throws 注解声明异常

  • 所有异常都是 Throwable 的子类型;throw 表达式是有类型的,它的类型是 Nothing