Flow 예외 처리

Flow 수집(collect)은 방출(emit)하는 곳이나 연산자 안의 코드가 예외를 발생시키는 경우 예외와 함께 완료될 수 있음.

수집기에서의 try와 catch

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking<Unit> {
    try {
        simple().collect { value ->
            println(value)
            check(value <= 1) { "Collected $value" }
        }
    } catch (e: Throwable) {
        println("Caught $e")
    }
}

fun simple(): Flow<Int> = flow {
    for (i in 1..3) {
        println("Emitting $i")
        emit(i) // emit next value
    }
}

실행결과
Emitting 1
1
Emitting 2
2
Caught java.lang.IllegalStateException: Collected 2

모든 것이 잡힌다

fun main() = runBlocking<Unit> {
    try {
        simple().collect { value -> println(value) }
    } catch (e: Throwable) {
        println("Caught $e")
    }
}

fun simple(): Flow<String> = flow {
    for (i in 1..3) {
        println("Emitting $i")
        emit(i)
    }
}.map { value ->
    println("Map $value")
    check(value <= 1) { "Crashed on $value" }
    "string $value"
}

실행결과
Emitting 1
Map 1
string 1
Emitting 2
Map 2
Caught java.lang.IllegalStateException: Crashed on 2

예외 투명성(Exception Transparency)

fun main() = runBlocking<Unit> {
    simple()
        .catch { e -> emit("Caught $e") } // emit on exception
        .collect { value -> println(value) }
}

실행결과
Emitting 1
string 1
Emitting 2
Caught java.lang.IllegalStateException: Crashed on 2

투명한 catch