# Table Of Contents

# Throwable

Kotlin은 오류가 발생하면 Error 또는 Exception을 발생시킨다. ErrorException은 모두 Throwable클래스를 상속한다.

# Error

Error는 코드에서 잡아낼 수 없으며 어플리케이션 자체가 다운된다. 대표적으로 OutOfMemoryError, StackOveflowError가 있다.

# Exception

Exceptiontry-catch구문으로 잡아낼 수 있으며, 프로그램이 다운되지 않도록 처리할 수 있다. 대표적으로 값이 null인 변수에 접근할 때 발생하는 NullPointException이 있다.

var person: Person? = null

try {
    // 값이 null인 변수 person에 접근하므로 NullPointException이 발생
    person!!.printName()
} catch (exception: NullPointerException) {
    // 프로그램이 다운되지 않고 catch문이 실행
    println("NullPointException has occurred.")
} finally {
    // finally 구문은 에러 처리와 상관없이 무조건 실행되는 코드
}

함수에서 try-catch구문을 바로 반환할 수도 있다.

fun getSomething(): String {
    return try {
        "something"
    } catch(e: Exception) {
        "nothing"
    }
}

var something = getSomething()

개발자가 직접 Exception을 정의할 수 있다.

class CustomException constructor(message: String): Exception(message) {
    // ...
}

개발자가 직접 Exception을 발생시킬 수도 있다. 이 때는 키워드 throw를 사용한다.

try {
    // 직접 Exception을 발생
    throw CustomException("This is custom exception message.")
} catch (exception: CustomException) {
    println(exception.message)
} finally {
    // ...
}

Exception을 발생시킬 수 있는 메소드에는 @Throws 어노테이션을 붙여 에러 가능성을 표기할 수 있다.

@Throws(CustomException::class)
fun getUsers() {
    throw CustomException("This is CustomException.")
}

@Throws어노테이션이 붙은 메소드는 try-catch문 내에서 호출하는 걸 권장한다.

try {
    getUsers()
} catch (e: CustomException) {
    println(e.message)
}