스터디/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
}

 

 

출처:

https://toss.tech/article/kotlin-result

728x90