[Kotlin] Result란?
코틀린의 runCatching
코틀린에서는 runCatching을 통하여 에러 핸들링을 할 수 있습니다.
API를 호출하는 코드에서 API의 응답 에러에 따른 비즈니스 로직을 다르게 가져가고 싶을 수 있습니다.
어떤 경우에는 에러를 캐치해서 다른 메시지를 던지고 싶을 수 있으며, 어떤 코드에서는 그 에러를 무시하고 다른 로직을 수행하고 싶을 수 있습니다.
즉, 동작이 성공하든 실패하든 동작의 결과를 캡슐화해서 나중에 처리될 수 있도록 하는 것이 목적입니다.
함수형 방식의 에러 처리도 가능하며 Coroutines에서 에러 처리를 할 때 구글이 권장하는 방식이기도 합니다.
try.. catch 사용 시
try {
loginApiClient.login(request)
}
catch (e: LoginException) {
if (e.errorCode == "INVALID_PASSWORD") {
return null
} else {
throw e
}
}
runCatcahing 사용 시
return runCatching {
loginApiClient.login(request)
}.onFailure { e ->
if (e.errorCode != "INVALID_PASSWORD") throw e
}.getOrNull()
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)
}
}
try..catch로직을 그대로 사용하지만 Result로 감싸서 반환합니다.
Result 사용 예시
에러를 무시하고 null 반환
val response = runCatching {
login()
}.getOrNull()
성공/에러 시 각각 특정 동작 수행 후 에러 던지기
val response = runCatching {
login()
}.onSuccess {
logger.info("성공!")
}.onFailure {
logger.info("실패!")
}.getOrThrow()
참고자료
https://toss.tech/article/kotlin-result
에러 핸들링을 다른 클래스에게 위임하기 (Kotlin 100% 활용)
Kotlin의 Result로 MSA에서 에러가 전파되지 않는 안전한 환경을 만드는 방법을 알아봅니다.
toss.tech
https://dev-repository.tistory.com/105
Kotlin Result 에러 핸들링
Result와 runCatching은 오류를 처리할 수 있는 방법 중에 하나다. Result는 동작이 성공하든 실패하든 동작의 결과를 캡슐화해서 나중에 처리될 수 있도록 하는 것이 목적이다. 이 Result와 함께 사용할
dev-repository.tistory.com