이번 글에서 다룰 내용
Kotlin에서 코드를 보다 보면, 어떤 코드는 예외 발생 상황에서 Exception을 던지고 어떤 코드는 Error을 던진다. 이번 글에서는 이 둘의 차이에 대해서 다뤄보고자 한다.
Kotlin의 Exception과 Error의 차이
Kotlin에서의 예외 처리는 기본적으로 Java 기반의 예외 처리 체계를 따른다.
@SinceKotlin("1.1") public actual typealias Error = java.lang.Error
@SinceKotlin("1.1") public actual typealias Exception = java.lang.Exception
따라서 이 둘의 차이를 이해하기 위해서는 해당 Java 소스를 확인할 필요가 있다. 소스를 확인하면서 둘의 차이를 확인해보자.
Exception
Java에서 Exception은 Throwable의 서브 타입으로 선언되어 있으며, throw Exception("예외 발생")과 같이 사용할 수 있다.
public class Exception extends Throwable
이렇게 던저진 Exception은 try catch를 통해 잡아낼 수 있다.
try {
throw Exception("예외 발생")
} catch(e: Exception) {
println(e)
}
실제로 Exception 클래스의 주석 설명에는 다음과 같이 표시되어 있다.
The class Exception and its subclasses are a form of Throwable that indicates conditions that a reasonable application might want to catch.
Exception과 그 서브 클래스는들은 잡아내져야 하는 합당한 이유가 있는 Throwable을 뜻한다.
즉, Exception은 try catch를 통해 잡아질 수 있는 예외이다.
Error
Java에서 Error은 Throwable의 서브 타입으로 선언되어 있으며, 따라서 throw Error("오류 발생")과 같이 사용할 수 있다.
public class Error extends Throwable
다만, Error가 Exception과 다른 점은 Error은 심각한 오류를 나타내므로, 잡아내거나 처리하지 않는 것이 좋다는 점이다. 다음은 Error의 설명이다.
위 글에서 하이라이팅 한 곳을 해석하면 다음과 같은 설명이 된다.
An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.
Error은 Throwable의 서브 클래스로, try catch로 잡으면 안되는 심각한 문제를 나타내는데 사용된다.
즉, Error은 try catch로 잡는 것이 권장되지 않는 심각한 예외로, 그대로 발생시키는 것이 좋다.
물론 Error도 try catch로 잡아낼 수 있지만, 이런 경우 심각한 예외를 처리할 수 없을 수 있기 때문에 지양해야 한다.
정리
Exception과 그 서브 클래스들은 try catch로 잡아내져도 되는 예외이고, Error은 try catch로 잡으면 안되는 예외이다.