개요
필자는 자바에서 예외 처리를 할 때 try-catch문을 많이 사용했었다. Kotlin에서는 어떻게 예외 처리를 하는지 궁금해서 포스팅을 해본다.
프로그램을 실행할 때 내가 작성한 코드가 제대로 작동되지 않는 현상이 있다. 이 경우를 예외(Exception)라고 한다.
우리는 이 예외를 잡기 위해서 예외 처리를 하는데 주로 사용하는 것이 try-catch문, throw문 등이 있다.
try-catch
자바와 마찬가지로 try-catch문이 제공되며 사용 방법은 똑같다.
try {
// 예외 발생 가능성이 있는 코드
} catch (error: 예외 클래스) {
// 예외 처리 코드
} finally {
// 무조건 실행할 코드
}
finally 구문은 무조건 사용하는 게 아니라 필요할 때만 사용한다.
만약 try 구문에서 파일 열기를 했다면 finally 구문에서는 반드시 파일 닫기를 해줘야 한다. 이렇듯 finally 구문은 반드시 해야 할 작업이 있을 때 사용한다.
위 코드처럼 Kotlin에서는 try-catch문을 예외 처리할 때 반드시 작성해야 하는 것은 아니다. Java는 강제로 Runtime Exception이 발생할 구문이 있다면 반드시 try-catch문을 작성하라고 에러를 던져줬는데 Kotlin에서는 그런 게 없다.
Kotlin에서는 프로그래밍 로직에서 예외 처리를 하길 권장하기 때문에 try-catch문은 선택이 된 것이다. 즉, Java처럼 예외 발생 위험이 있다고 알려주지 않는다.
위 코드처럼 Java는 Runtime Exception이 발생할 위험이 있으면 빨리 예외 처리를 하라고 예외체크를 해준다. ( throw를 던지거나 try-catch문을 작성해줘야 한다는 걸)
반드시 코드에서 예외 체크를 해주어야 하는 것을 Checked Exception이라고 한다.
Kotlin는 Unchecked Exception을 지향하는 언어이다. "이건 Runtime Exception이 발생할 가능성 있으니까 빨리 throw나 try-catch를 사용해서 예외 처리해!"라고 예외 체크를 해주지 않는다. 실행할 때 Runtime Exception을 자동으로 처리해 준다고 생각해도 무방하다.
try with resources
해당 문법은 JDK 17에 추가된 문법으로 try 구문 인자로 괄호 안에 외부 자원을 만들어주고 try가 끝나면 해당 자원을 해제해 준다.
Kotlin에서는 try with resources 문법이 없고 use 확장 함수로 대체하여 사용할 수 있다.
Java
Kotlin
throw
throw는 의도적으로 예외를 발생시킨다. throw 뒤에 원하는 예외를 작성해 주면 되고 메시지도 남기고 싶다고 한다면 해당 예외 안에 문자열로 메시지를 작성해 주면 된다.
Result 패턴 사용하기
Result 패턴은 함수가 성공하면 해당 결과를 반환하고 예외가 발생하면 지정한 작업을 수행하는 패턴이다.
* getOrElse()
예외가 발생했을 경우 사용하는 확장 함수이다.
* getOrNull()
예외가 발생했을 경우 null을 반환한다.
* onFailure()
예외가 발생했을 경우 onFailure() 확장 함수를 사용하여 내부 작업을 수행할 수 있다.
* onSuccess()
성공했을 경우 내부 작업을 수행한다.
* map
성공했을 경우 값을 map 내부 값으로 변경한다.
* recover()
map과 정반대로 실패했을 경우 해당 값을 recover 내부 값으로 변경한다.
Kotlin에서 예외를 처리하는 방법이 다양해서 좀 머리 아팠다.ㅋ (하지만 배워두면 두구두구 잘 사용하니까 👍)
부족한 부분이나 잘못된 부분이 있을 수 있습니다. 댓글로 남겨주시면 감사하겠습니다. ☺️
'Kotlin' 카테고리의 다른 글
[Kotlin] 클래스(Class), 데이터 클래스(Data Class) (4) | 2024.12.04 |
---|---|
[Kotlin] 객체 지향 프로그래밍(OOP) (0) | 2024.12.03 |
[Kotlin] 함수(Function), 람다(lambda) (4) | 2024.12.02 |
[Kotlin] JVM, Kotlin 컴파일 과정 (2) | 2024.12.02 |
[Kotlin] 컬렉션(List, Set, Map), 관련 함수들 (1) | 2024.11.18 |