스칼라 예외 처리


Scala의 예외 처리는 Java 등 다른 언어와 유사합니다.

Scala 메서드는 값을 반환하지 않고 예외를 발생시켜 관련 코드의 실행을 종료할 수 있습니다.


예외 발생

Scala는 throw 메소드를 사용하여 Java와 동일한 방식으로 예외를 발생시킵니다. 예를 들어 새 매개변수 예외 발생:

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의 경우와 정확히 동일합니다. Exception은 순서대로 catch되기 때문에 가장 많이 발생하는 Exception인 Throwable을 앞에 쓰면 그 뒤의 경우는 catch되지 않으므로 맨 마지막에 적어야 한다.


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...