코틀린의 모든 예외 클래스는 최상위 예외 클래스인 Throwable 을 상속한다
Error : 시스템에 비정상적인 상황이 발생했을 경우이며 예측이 어렵고 기본적으로 복구가 불가능합니다.
Exception : 시스템에서 포착 가능하여(try-catch) 복구 가능하며 예외 처리를 강제합니다.
@Transactional에서 해당 예외가 발생하면 기본적으론 롤백이 동작하지 않습니다.
RuntimeException : 런타임시에 발생하는 예외이며 예외 처리를 강제하지 않습니다.
코틀린에서는 자바의 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