본문 바로가기

IT/kotlin언어

[Flow] Flow combine 에러시 미동작 관련 내부 동작

 

실제 두개의 액션을 실행시켜 동작시

throw 즉 에러를 강제로 던지거나 예외사항이 발생했을때

downStream으로 가지 않는 이슈가 있었다.

combine(
    action1(query),
    action2(query)
) { action1, action2 ->
    action1 to action2
}.collect { entity ->
  ...
}

 

catch를 통해 upStream에 대한 예외처리를 하면 되지만 왜 그런지 내부를 살펴보자.

 

 

실제 combine 내부의 동작을 보면

 

 

내부에 result 액션에 대한 동작을 channel을 통해 가져와 동작시키게 되어있지만,

결과 액션 이후 result를 transform 하여 변경된 응답값을 뱉는 과정을 타야하지만

실제 while문 내부 resultChannel.receiveCatching() <- 에러가 있을경우 break문을 타게되어 하나라도 에러가 나게 된다면 

실행되지 않는다.

 

 

combine(
    action1(query),
    action2(query)
) { action1, action2 ->
    action1 to action2
}
.catch{
  emit(failure)
}
.collect { entity ->
  ...
}

따라서 upStream에 대한 에러처리를 위해 catch block을 통해 원하는 에러값을 반환해주어야 한다.

 

'IT > kotlin언어' 카테고리의 다른 글

[flow] coroutine flow 문서 읽기 -2  (0) 2022.05.17
[flow] coroutine flow 문서 읽기 -1  (0) 2022.05.10
[코틀린] 코틀린 제너릭  (0) 2019.12.27
[코틀린] kapt  (0) 2019.12.27
[코틀린] let, with, run, also, apply 정리  (0) 2019.12.05