Skip to content
LazySoul edited this page Aug 22, 2016 · 4 revisions

try, catch, finally 사용하기

함수형 구성요소와 강력한 타입판정을 통해 스칼라는 예외나 예외처리의 필요성을 줄이는 코딩 유형을 장려합니다.
그럼에도 불구하고 여전히 예외를 사용합니다.

자바와 달리 스칼라에는 검증 예외(checked exception)가 없습니다. 검증 예외는 스칼라에서 비검증으로 취급됩니다.  
또한 스칼라 메서드 정의에는 throws 절이 없고, 대신 자바와의 상호 운용에 유용한 @throws 어노테이션이 있습니다. (23.2절 참고)

스칼라는 다른 패턴 매치와 마찬가지로 예외 처리를 취급합니다. 따라서 여러종류의 예외를 간결하게 처리하도록 구현할 수 있습니다.

// src/main/scala/progscala2/rounding/TryCatch.scala
package progscala2.rounding

object TryCatch {
  /** Usage: scala rounding.TryCatch filename1 filename2 ... */
  def main(args: Array[String]) = {
    args foreach (arg => countLines(arg))                            // <1>
  }

  import scala.io.Source                                             // <2>
  import scala.util.control.NonFatal

  def countLines(fileName: String) = {                               // <3>
    println()  // Add a blank line for legibility
    var source: Option[Source] = None                                // <4>
    try {                                                            // <5>
      source = Some(Source.fromFile(fileName))                       // <6>
      val size = source.get.getLines.size
      println(s"file $fileName has $size lines")
    } catch {
      case NonFatal(ex) => println(s"Non fatal exception! $ex")      // <7>
    } finally {
      for (s <- source) {                                            // <8>
        println(s"Closing $fileName...")
        s.close
      }
    }
  }
}

이런 표현은 널리 쓰이는 관용구입니다. Option을 검사해도 Some이면 어떤 작업을 수행하고, None이면 무시할 필요가 있을 때는 for 내장을 사용합니다.

Clone this wiki locally