Kotlin/Kotlin

[Kotlin] Result란?

Junuuu 2022. 12. 4. 00:01
반응형

코틀린의 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