본문 바로가기

Kotlin

Kotlin - Exceptions

https://kotlinlang.org/docs/exceptions.html

 

Exceptions | Kotlin

 

kotlinlang.org

Exception classes

Kotlin의 모든 exception 클래스는 Throwable을 상속하기 때문에, message, stack trace, optional cause를 가진다.

예외를 발생시키기 위해서는 다른 언어들과 마찬가지로 throw 표현식을 사용한다.

throw Exception("Hi There!")

 

이렇게 던져진 예외를 잡기 위해서는 try ... catch ... finally 표현식을 사용한다. 

try {
    // some code
} catch (e1: SomeException) {
    // try 블럭의 코드를 실행하다 SomeException 타입의 예외가 발생하면 실행된다.
} catch (e2: SomeException2) {
	...
} catch (e: Exception) {
	...
} finally {
    // 예외 발생 여부와 관계없이 무조건 실행 된다.
}

catch 블록이나 finally 블록은 생략 될 수 있다. 하지만 하나 이상의 블록은 반드시 필요하다.

val a = 5
val b = 0

// catch나 finally 블록이 없어서 컴파일 오류 발생
try {
    println(a / b)
}

// catch 블록만 작성
try {
    println(a / b)
} catch (e: Exception) {
    println("Exception")
}
// Exception


// finally 블록만 작성, 예외 처리가 되지 않아 예외를 발생시킨다.
try {
    println(a / b)
} finally {
    println("finally")
}
// 예외 발생


// catch와 finally 블록을 모두 작성
try {
    println(a / b)
} catch (e: Exception) {
    println("Exception")
} finally {
    println("finally")
}
// Exception
// finally


// 발생하는 예외마다 예외 처리를 다르게 할 수 있다.
try {
    println(a / b)
} catch (e1: ArithmeticException) {
    println("This is ArithmeticException")
} catch (e: Exception) {
    println("Exception")
}
// This is ArithmeticException

표현식 으로서의 try

try는 표현식이기 때문에 반환(return) 값을 가진다. 따라서 아래같은 코드 작성이 가능하다. 

표현식으로 작성할때는 하나 이상의 catch 블록이 필수로 작성 되어아야 하며, finally 블록은 결과에 영향을 미치지 않는다.

// String을 Int 로 변환하는 과정에서 변환이 되지 않는다면 0 으로 처리
fun parseIntElseZero(s: String): Int {
    val a: Int = try {
    	println("This is parseInt function")
        s.toInt()
    } catch (e: Exception) {
        0
    }

    return a
}

Checked exceptions

Kotlin은 checked exception의 (checked exception이 발생할 가능성이 있는 모든 코드에 try...catch를 작성해야 하는) 비효율성으로 인해 checked exception을 없앴다. 따라서 함수를 사용하는 사용자들에게 어떤 예외들이 발생할 가능성이 있다고 경고 하고 싶다면 함수명 뒤에 throws... 를 붙이는 것이 아니라 @Throws 어노테이션을 사용해서 표시 정도 한다.

@Throws(Exception::class)
fun exceptionDemo1() {
    val a = 5
    val b = 0

    // catch나 finally 블록이 없어서 컴파일 오류 발생
    try {
        println(a / b)
    }
}

 

The Nothing type

Kotlin 에서는 throw도 표현식이고, throw 가 반환하는 값은 Nothing 타입이다. 이름에서와 같이 Nothing 타입은 값을 가지지 않고, 절대 실행 될 일이 없는 코드 위치를 표시하는데 사용된다. 

함수를 작성할때 Nothing 타입을 반환 타입으로 작성하면 해당 함수는 return을 하지 않는 함수 (무조건 예외가 발생하고 끝나는 함수) 임을 나타낸다. 이 함수가 실행되면 컴파일러는 이 이후 코드는 실행되지 않는다고 판단한다.

fun fail(message: String): Nothing {
    throw IllegalArgumentException(message)
}

val s = person.name ?: fail("Name required")

Nothing 타입은 타입 추론시 사용 되기 도 한다. 어떤 변수에 타입을 명시 하지 않고 null 값을 할당 하면 Nothing? 타입으로 추론한다.

val x = null           // 'x' has type `Nothing?`
val l = listOf(null)   // 'l' has type `List<Nothing?>
반응형

'Kotlin' 카테고리의 다른 글

Kotlin - 상속 (Inheritance)  (0) 2024.01.18
Kotlin - Packages and imports  (0) 2024.01.13
Kotlin - Returns and jumps  (0) 2024.01.11
Kotlin - 반복문(for, while)  (0) 2024.01.10
Kotlin - 조건문  (2) 2024.01.07