코틀린 예외처리

짱구·2023년 3월 12일
0

kotlin

목록 보기
3/8
post-thumbnail

코틀린의 모든 예외 클래스는 최상위 예외 클래스인 Throwable 을 상속한다

  • Error : 시스템에 비정상적인 상황이 발생했을 경우이며 예측이 어렵고 기본적으로 복구가 불가능합니다.

    • e.g. OutOfMemoryError, StackOverflowError, etc
  • Exception : 시스템에서 포착 가능하여(try-catch) 복구 가능하며 예외 처리를 강제합니다.

    • IOException, FileNotFoundException, etc
  • @Transactional에서 해당 예외가 발생하면 기본적으론 롤백이 동작하지 않습니다.

    • rollbackFor를 사용해야함
  • RuntimeException : 런타임시에 발생하는 예외이며 예외 처리를 강제하지 않습니다.

    • e.g. NullPointerException, ArrayIndexOutOfBoundsException, etc

코틀린에서는 자바의 Exception 계층을 코틀린 패키지로 래핑합니다.

자바에서 체크드 익셉션은 컴파일 에러가 발생하기 때문에 무조건 try-catch로 감싸거나 throws로 예외를 전파해야합니다.

try {
	Thread.sleep(1);
} catch (InterruptedException e) {
	// 예외 처리
}

코틀린은 체크드 익셉션을 강제하지 않습니다.
아래의 코드는 코틀린에서 컴파일 오류가 발생하지 않으며 정상작동 됩니다.

Thread.sleep(1);

또 원하는 경우에는 try-catch를 쓸 수 있습니다.

try {
	Thread.sleep(1)
} catch (e: Exception) {
	// 예외 처리
}

코틀린에서의 try-catch는 '표현식'입니다.

val a = try { 
	"1234".toInt() 
} catch (e: NumberFormatException) {
	println("catch 동작")
}
println("a = ${a}")
//a = 1234

// 오류시
val a = try {
	"1234s".toInt()
} catch (e: NumberFormatException) {
	println("catch 동작")
}
    println("a = ${a}")
}
// catch 동작
// a = kotlin.Unit   // Unit으로 반환

finally 를 사용하면 try-catch의 마지막에 수행될 코드를 작성할 수 있습니다.

try {
	throw Exception()
} catch (e: Exception) {
	println("catch 수행!")
} finally {
	println("finally 수행!")
}

코틀린에서 Exception을 발생시키려면 java와 동일하게 throw를 사용합니다.

throw Exception("예외 발생!")

Exception in thread "main" java.lang.Exception: 예외 발생!
at FileKt.main (File.kt:2)
at FileKt.main (File.kt:-1)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (:-2)

코틀린에서는 throw 역시 표현식이기 때문에 throw를 리턴할 수 있습니다.
그리고 return 타입으로 Nothing 타입을 사용하면 컴파일러는 해당 코드 이후는 실행되지 않는 다는 경고를 보여줍니다.

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

엘비스 연산자와 사용하면 null 안전 코드를 작성하지 않아도 됩니다.

fun main() {
  val a: String? = null
  val b: String = a ?: failFast("a is null") 
  println(b.length)
}

a가 null이면 Nothing type, a가 null이 아니면 String Type으로 반환하기에 절대 null이 반환 될 수 없습니다.
그렇기에 val b: String?와 같은 nullable한 타입이 아닌 none-null type인 val b: String로 쓰일 수 있습니다.

출처 : fastcampus

profile
코드를 거의 아트의 경지로 끌어올려서 내가 코드고 코드가 나인 물아일체의 경지

0개의 댓글