Latest web development tutorials

Scala 異常處理

Scala 的異常處理和其它語言比如Java 類似。

Scala 的方法可以通過拋出異常的方法的方式來終止相關代碼的運行,不必通過返回值。


拋出異常

Scala 拋出異常的方法和Java一樣,使用throw 方法,例如,拋出一個新的參數異常:

throw new IllegalArgumentException

捕獲異常

異常捕捉的機制與其他語言中一樣,如果有異常發生,catch字句是按次序捕捉的。 因此,在catch字句中,越具體的異常越要靠前,越普遍的異常越靠後。 如果拋出的異常不在catch字句中,該異常則無法處理,會被升級到調用者處。

捕捉異常的catch子句,語法與其他語言中不太一樣。 在Scala裡,借用了模式匹配的思想來做異常的匹配,因此,在catch的代碼裡,是一系列case字句,如下例所示:

import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException

object Test {
   def main(args: Array[String]) {
      try {
         val f = new FileReader("input.txt")
      } catch {
         case ex: FileNotFoundException =>{
            println("Missing file exception")
         }
         case ex: IOException => {
            println("IO Exception")
         }
      }
   }
}

執行以上代碼,輸出結果為:

$ scalac Test.scala 
$ scala Test
Missing file exception

catch字句裡的內容跟match裡的case是完全一樣的。 由於異常捕捉是按次序,如果最普遍的異常,Throwable,寫在最前面,則在它後面的case都捕捉不到,因此需要將它寫在最後面。


finally 語句

finally 語句用於執行不管是正常處理還是有異常發生時都需要執行的步驟,實例如下:

import java.io.FileReader
import java.io.FileNotFoundException
import java.io.IOException

object Test {
   def main(args: Array[String]) {
      try {
         val f = new FileReader("input.txt")
      } catch {
         case ex: FileNotFoundException => {
            println("Missing file exception")
         }
         case ex: IOException => {
            println("IO Exception")
         }
      } finally {
         println("Exiting finally...")
      }
   }
}

執行以上代碼,輸出結果為:

$ scalac Test.scala 
$ scala Test
Missing file exception
Exiting finally...