PHpullh
학습 라이브러리/Kotlin/runCatching & Result

KOTLIN · 예외처리

runCatching & Result

함수형 스타일의 에러 처리. Result 타입으로 성공/실패를 명시적으로 표현합니다.

예외처리중급runCatchingResultfoldgetOrDefaultonSuccess

핵심 설명

함수형 스타일의 에러 처리. Result 타입으로 성공/실패를 명시적으로 표현합니다.

Kotlin code

// runCatching — try-catch를 Result로 감쌈
fun divide(a: Int, b: Int): Result<Int> =
    runCatching { a / b }

// fold — 성공/실패 처리
fun main() {
    divide(10, 2)
        .fold(
            onSuccess = { println("결과: $it") },
            onFailure = { println("에러: ${it.message}") }
        )

    divide(10, 0)
        .fold(
            onSuccess = { println("결과: $it") },
            onFailure = { println("에러: ${it.message}") }
        )

    // map / mapCatching — 체이닝
    val result = runCatching { "42".toInt() }
        .map { it * 2 }
        .getOrDefault(0)
    println(result)  // 84

    // getOrElse
    val value = runCatching { "abc".toInt() }
        .getOrElse { -1 }
    println(value)   // -1

    // 여러 연산 체이닝
    runCatching { fetchData() }
        .mapCatching { parseData(it) }
        .onSuccess { println("완료: $it") }
        .onFailure { println("실패: ${it.message}") }
}

fun fetchData() = "raw-data"
fun parseData(s: String) = s.uppercase()

학습 팁

runCatchingError 타입 예외(OutOfMemoryError 등)도 잡습니다. 치명적 에러를 무시하지 않도록 isFailure 체크 시 예외 타입을 확인하세요.

주의할 점

Android에서 Result를 ViewModel의 LiveDataStateFlow에 담으면 제네릭 중첩 문제가 생길 수 있습니다. 별도 sealed class를 사용하는 것이 더 명확합니다.

자주 묻는 질문

runCatching & Result란 무엇인가요?

함수형 스타일의 에러 처리. Result 타입으로 성공/실패를 명시적으로 표현합니다.

runCatching & Result 학습 시 주의할 점은 무엇인가요?

Android에서 Result 를 ViewModel의 LiveData 나 StateFlow 에 담으면 제네릭 중첩 문제가 생길 수 있습니다. 별도 sealed class를 사용하는 것이 더 명확합니다.