스터디/Kotlin
코틀린의 Error Handling - runCatching
zoodi
2025. 3. 24. 12:32
728x90
코틀린의 runCatching
자바의 try~catch 와 동일하게 지원하지만 조금 다른 방법으로 핸들링 할 수도 있습니다!
예를들어 아래와 같은 요구사항이 있다고 가정해봅니다.
- LoginApiClient 호출 시 LoginException 발생
- errorCode = INVALID_PASSWORD인 경우 예외를 발생하지 않고 null을 리턴한다.
- 그 외 에러는 모두 예외를 발생시킨다.
try ~ catch 를 사용한 코드
try {
loginApiClient.login(request)
} catch (e: LoginException) {
if (e.errorCode == "INVALID_PASSWORD") {
return null
} else {
throw e
}
}
Java 에서는 익숙하게 위처럼 try~catch 구문으로 작성할 수 있습니다.
코틀린에서는 runCatching 을 사용하여 아래와 같이 표현할 수 있습니다.
return runCatching {
loginApiClient.login(request)
}.onFailure { e ->
if (e.errorCode != "INVALID_PASSWORD") throw e
}.getOrNull()
runCatching 메소드를 살펴보면 try catch 로직을 그대로 사용하지만 Result로 감싸서 반환하는 것을 확인할 수 있습니다.
- kotlin.runCatching
@InlineOnly
@SinceKotlin("1.3")
public inline fun <R> runCatching(block: () -> R): Result<R> {
return try {
Result.success(block())
} catch (e: Throwable) {
Result.failure(e)
}
}
- 에러가 발생하지 않으면 → Result.success 반환
- 에러가 발생하면 → Result.failure 반환
Result란?
runCatching 은 Result<T>를 반환하는데 Result가 뭘까요?
Result 의 value는
- 성공일 경우: T 를 타입으로 하는 값
- 실패일 경우: Failure를 wrapper class로 하는 exception을 값으로합니다.
Result 사용 예시
에러 무시하고 null 반환
val response = runCatching {
login()
}.getOrNull()
기본 값 반환
val response = runCatching {
login()
}.getOrDefault(emptyList())
에러 발생 시 다른 동작 수행
val response = runCatching {
login()
}.getOrDefault(emptyList())
에러가 발생한 경우에만 해당 에러 객체 반환
val response = runCatching {
login()
}.getOrElse { ex ->
logger.warn(ex) { "에러 발생" }
// 에러를 던지고 싶다면
throw ex
}
출처:
728x90