[Kotlin] 코틀린 기초(5) - 예외 처리

sw·2021년 12월 26일
0
  • 코틀린에서 Exception 처리는 Java나 다른 언어와 비슷하다.
    함수를 정상적으로 종료할 수 있지만 오류가 발생하면 Exceptionthrow할 수 있다.
    함수를 호출하는 쪽에서 그 Exception을 잡아 처리하거나 함수 호출 단에서 catch하지 않는다면 함수 호출 스택을 거슬러 올라가면서 Exception을 처리하는 부분이 나올 때까지 Exceptionrethrow한다.

  • 코틀린의 throwexpression이므로 다른 expression에 포함될 수 있다.

val percentage =
    if (number in 1..100)
        number
    else 
        throw IllegalArgumentException(
        "A percentage value must be between 0 and 100: $number")
  • try, catch, finally
    Java와 마찬가지로 Exception을 처리하려면 trycatch, finally절을 함께 사용한다.
fun readNumber(reader: BufferedReader): Int? {  // 함수가 던질 수 있는 Exception을 명시할 필요가 없다.
    try {
        val line = reader.readLine()
        return line.toInt()
    } catch (e: NumberFormatException) {
        return null
    } finally {                                 // finally는 Java와 똑같이 작동한다.
        reader.close()
    }
}

-> Java 코드와 가장 큰 차이는 throws절이 코드에 없다는 점이다. Java에서는 함수 선언 뒤에 throws IOException을 붙여야한다. 왜냐하면 IOException이 체크 예외이기 때문이다.

Java에서는..

체크 예외(Check Exception)
RuntimeExeception 클래스를 상속하지 않은 Exception 클래스들이다. 체크 예외는 예외가 발생할 수 있는 메소드를 사용할 경우 반드시 예외를 처리하는 코드를 함께 작성해야 한다. 예외를 처리하기 위해서 catch문으로 잡거나 throws를 통해 메소드 밖으로 던질 수 있다. 만약 예외를 처리하지 않으면 컴파일 에러가 발생한다.

언체크 예외(Uncheck Exception)
RuntimeException 클래스를 상속한 Exception 클래스들은 예외 처리를 강제하지 않기 때문에 언체크 예외라고 불린다. 에러를 처리하지 않아도 컴파일 에러가 발생하지 않는다. RuntimeException은 주로 프로그램에 문제가 있을 때 오류가 발생하도록 의도된 것으로 대표적으로 NullPointerException이 있다. 즉, RuntimeException은 예상치 못했던 상황에서 발생하는 것이 아니므로 굳이 예외 처리를 강제하지 않는다.

  • 이에 반해 코틀린에서는 체크 예외와 언체크 예외를 구별하지 않는다. 그래서 함수가 던지는 Exception을 잡아내도 되고 잡아내지 않아도 된다. 그리고 Java 7의 자원을 사용하는 try-with-resource의 경우 코틀린에선 그런 경우를 위한 특별한 문법을 제공하진 않지만 라이브러리 함수로 같은 기능을 구현한다.

  • try를 Expression으로 사용하기

fun readNumber(reader: BufferedReader) {
    val number = try {
        reader.readLine().toInt()
    } catch (e: NumberFormatException) {
        null
    }

    println(number)
}

-> try 키워드는 ifwhen과 마찬가지로 expression이다. 그러나 if와 달리 try의 본문은 반드시 중괄호로 둘러싸야 한다.

profile
끄적끄적

0개의 댓글