7-4 内建的控制结构 - 用try表达式实现异常处理

1.抛出异常的表达式的类型为Nothing,Int可以兼容Nothing。

def method1(n: Int): Unit ={
  val half: Int = if (n % 2 == 0) n / 2 else throw new RuntimeException("n must be even")
}

2.try-catch-finally的基本语法,异常处理需要配合模式匹配(pattern matching)使用

def main(args: Array[String]): Unit = {
  
  val fileReader: FileReader = new FileReader("input.txt")
  try {
    //处理文件内容
  }catch {
    case ex: FileNotFoundException => //处理找不到文件的情况
    case ex: IOException => //处理其他IO错误
  }finally {
    fileReader.close
  }
}

3.返回值

①正常情况下,如果没有异常抛出,整个表达式的结果就是try子句的结果;如果有异常抛出并且被捕获时,整个表达式的结果就是对应的catch子句的结果;而如果有异常抛出并且没有被捕获,整个表达式就没有结果。如果有finally子句,该子句计算出来的值会被丢弃(即finally子句不返回值)。

//返回1
def g(): Int = try 1 finally 2

②跟Java一样,当finally子句包含一个显式的返回语句(即return),或者抛出某个异常,那么这个返回值或异常将会“改写”(overrule)任何之前的try代码块或某个catch子句中产生的值。

//返回2
def f(): Int = try return 1 finally return 2

  

 

posted @ 2020-11-22 14:39  地中有山  阅读(95)  评论(0编辑  收藏  举报