본문 바로가기
Language/Kotlin

[Kotlin IN ACTION] - Kotlin Exception (예외처리)

by Jman 2022. 7. 14.
코틀린의 예외처리는 자바나 다른 언어의 예외(exception) 처리와 비슷하다.

함수는 정상적으로 종료할 수 있지만 오류가 발생하면 예외를 던질(throw) 수 있다.
여기서 함수 호출하는 쪽에서는 그 예외를 잡아 처리할 수 있다.

만약, 발생한 예외를 함수 호출 단에서 처리(catch)하지 않으면 함수 호출 스택을 거슬러 올라가면서 예외를 처리하는 부분이 나올 때까지 예외를 다시 던진다(rethrow)

 

fun percentageCheck(percent : Int): Int {
    if(percent !in 0..100) {
        throw IllegalArgumentException(
            "A percentage value must be between 0 and 100 : $percent")
    }else {
        return percent
    }
}
println(percentageCheck(101))



fun percentageCheck(percent : Int): Int {
    if(percent in 0..100) {
        return percent
    }else {
        throw IllegalArgumentException(
            "A percentage value must be between 0 and 100 : $percent")
    }
}
println(percentageCheck(101))

 

 

try, catch, finally

예외 처리를 하려면 자바와 같이 try, catch, finally 절을 함께 사용한다.

fun readNumber(reader : BufferedReader) : Int? {
    return try {
        val line = reader.readLine()
        Integer.parseInt(line)
    } catch (e: java.lang.NumberFormatException) {
        null
    } finally {
        reader.close()
    }
}

val reader = BufferedReader(StringReader("3329"))
println(readNumber(reader))

자바 코드와 가장 큰 차이는 throws(이 경우 s가 붙음) 절이 코드에 없다는 점이다.

자바에서는 함수를 작성할 때, 함수 선언 뒤에 throws IOException 을 붙어야 한다.

이유는 IOException 이 체크 예외이기 때문이다. 자바에서는 체크 예외를 명시적으로 처리해야 한다.

 

그리고  코틀린은 자바에 있는 try-with-resource 문법을 제공하지 않는다.

하지만 라이브러리 함수로 같은 기능을 구현할수 있다.

 

try 를 식으로 사용

자바와 코틀린의 중요한 차이인 식.

finaly 절을 없애고 파일에 읽은 수를 출력하는 코드를 추가해보자.

fun readNumber(reader: BufferedReader) {
    val number = try {
        Integer.parseInt(reader.readLine())
    } catch (e: NumberFormatException) {
        println("예외 발생")
        return
        //null
    }
    println(number)
}

val reader = BufferedReader(StringReader("not a number"))
readNumber(reader)

try 키워드는 if 나 when 과 마찬가지로 식이다.

따라서 try의 값을 변수에 대입할 수 있다.

if 와 달리 try의 본문을 반드시 중괄호 { } 로 둘러써야 한다.