실무 프로젝트로 배우는 Kotlin & Spring/코틀린 기초

예외 처리

webmaster 2022. 10. 1. 17:03
728x90

Kotlin(JAVA)을 예외

  • Error : 시스템에 비정상적인 상황이 발생한 경우. 예측이 어렵고 기본적으로 복구가 불가능하다.
    • ex) OutOfMemoryError, StackOverFlowError
  • Exception : 시스템에서 포착 가능하여(try-catch) 복구 가능한 에러. 예외 처리 강제
    • ex) IOException, FileNotFoundException
    • @Transcactional에서 해당 예외가 발생한다면 기본적으로 롤백이 동작하지 않는다(rollbackFor를 사용해야 한다)
  • RuntimeException : 런타임 시 발생하는 예외, 예외 처리를 강제하지 않는다.
    • ex) NullPointerException, ArrayIndexOutOfBoundsException
  • 코틀린에서는 자바의 Exception 계층을 코틀린 패키지로 래핑 한다.
fun main() {
    //Thread.sleep(1000); //컴파일 오류 안난다
    try {
        //Thread.sleep(1000)
        throw Exception()
    } catch (e: Exception) { //직접 예외 처리를 할 수도 있다.
        println("에러 발생!")
    } finally {
        println("finally 실행!") //JAVA와 마찬가지로 finally를 동작시킬 수 있다
    }

    //코틀린에서는 try-catch 가 표현식이다.
    val a = try {
        "1234".toInt()
    } catch (e: Exception) {
        //예외가 발생하면, Unit을 반환한다.
        println("예외 발생 !")
    }
    println(a)

    //throw Exception("예외 발생!") //코틀린에서 예외를 발생하기 위해서는 throw 키워드를 사용하면 된다.

    //failFast("예외 발생!!")
    //println("이 메시지는 출력 될까?") //컴파일러가 해당 문장은 실행되지 않는다는 경고를 보여주게 된다. //Nothing 타입을 보고 판단.

    val b: String? = null
    val c = b ?: failFast("a is null") //엘비스 연산자와 Nothing 타입을 같이 사용하는 경우 반드시 c는 null이 아님이 보장된다
    println(c.length)

}

fun failFast(message: String): Nothing { //코틀린에서 throw를 반환하게 되면 Noting을 반환하게 된다.
    throw IllegalArgumentException(message)
}
  • 자바에서는 checkedException은 컴파일 오류가 발생하므로 무조건 try-catch로 감싸거나, throws로 예외 전파를 해야 한다.
  • 코틀린에서는 checkedException을 강제하지 않는다 -> 컴파일 오류가 발생하지 않는다.
    • 원하는 경우 try-catch로 감쌀 수 있다.
  • 코틀린에서의 try-catch는 표현식이다(반환 값이 있다)
  • finally를 사용하면 마지막에 수행될 코드를 작성할 수 있다.
  • 코틀린에서 예외를 발생시키기 위해서는 throw를 사용하면 된다(자바랑 같다)
    • throw 역시 표현식이기 때문에 리턴할 수 있다(Nothing 타입으로 반환)
    • Nothing 타입을 사용하면 컴파일러가 해당 코드 이후는 코드가 실행되지 않는다는 경고를 보여준다
    • 엘비스 연산자와 사용하면 null 안전 코드를 작성하지 않아도 된다.
728x90

'실무 프로젝트로 배우는 Kotlin & Spring > 코틀린 기초' 카테고리의 다른 글

상속  (0) 2022.10.02
클래스와 프로퍼티  (0) 2022.10.02
널 안정성  (0) 2022.10.01
흐름제어  (0) 2022.10.01
함수  (0) 2022.10.01