Flow retry, retryWhen
·
Study/Kotlin
이번 글에서는 예외로 인해 Flow가 비정상적으로 종료되었을 때해당 Flow를 다시 collect하는 방법에 대해 알아보려한다. 이런 시나리오가 필요한 가장 대표적인 예시에는 뭐가 있을까? 주기적으로 네트워크 요청을 통해 값을 갱신하는 화면이 있을 것이다. 코드로 예시를 보자.fun networkFlow(): Flow = flow { repeat(5) { index -> delay(1000) if (index 5번의 요청을 하고 마지막 요청에서는 예외가 발생하는 Flow를 만들어보았다. networkFlow() .catch { println("Handle exception in catch") } .collect { data -> print..
Flow Exception Transparency(예외 투명성)
·
Study/Kotlin
예외 투명성이라는 개념을 이해하기 위해 예시를 보자.suspend fun main() = coroutineScope { flow { try { emit(1) } catch (e: Exception) { println("Catch exception in Flow Builder") } }.collect { throw Exception("Exception in collect") }}이렇게 생긴 코드를 실행하면 과연 예외는 어떻게 처리될까? 이전까지의 내용을 봤을 때, 예외가 처리되지 않고 앱이 크래시가 될것으로 예상한다. 하지만 놀랍게도 try-catch에서 예외가 처리되어 앱 크래시가 발생하지 않는다. ..
Flow Exception Handling 살펴보기
·
Study/Kotlin
Flow가 종료되는 방식 이해하기Flow에서는 기본적으로 무슨 일이 일어날까? 값을 emit하거나 Flow 자체가 완료되는 것이다. 여기서 Flow가 완료될 때는 또 다시 두 가지 경우가 있다. 바로, 정상적으로 완료되거나 예외와 함께 종료되는 경우이다. .onCompletion { cause -> if (cause == null) { println("Flow completed successfully") }}만약 cause가 null인 경우, Flow가 정상적으로 종료된 것이고반대로 null이 아니라면 예외와 함께 종료된 것이다. Flow 내부에서 예외가 발생했을 때val someFlow = flow { emit("1") emit("2") throw Exception("Network ..