728x90
반응형
https://dalinaum.github.io/coroutines-example/15
finally
onCompletion - 문제 발생여부를 알수 있다.
명령형 finally 블록
완료를 처리하는 방법 중의 하나는 명령형의 방식으로 finally 블록을 이용하는 것입니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun simple(): Flow<Int> = (1..3).asFlow()
fun main() = runBlocking<Unit> {
try {
simple().collect { value -> println(value) }
} finally {
println("Done")
}
}
실행결과
1
2
3
Done
예외가 발생하던 , 성공하던 finally를 탄다.
선언적으로 완료 처리하기
onCompletion 연산자를 선언해서 완료를 처리할 수 있습니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun simple(): Flow<Int> = (1..3).asFlow()
fun main() = runBlocking<Unit> {
simple()
.map{
if(it > 2){
throw IllegalStateException()
}
it
}
.catch{ e -> emit(-99)}
.onCompletion { println("Done") }
.collect { value -> println(value) }
}
실행결과
1
2
-99
Done
onCompletion의 장점
onCompletion은 종료 처리를 할 때 예외가 발생되었는지 여부를 알 수 있습니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun simple(): Flow<Int> = flow {
emit(1)
throw RuntimeException()
}
fun main() = runBlocking<Unit> {
simple()
.onCompletion { cause -> if (cause != null) println("Flow completed exceptionally") }
.catch { cause -> println("Caught exception") }
.collect { value -> println(value) }
}
실행결과
1
Flow completed exceptionally
Caught exception
728x90
반응형
'Android 공부 > Coroutine' 카테고리의 다른 글
[XX캠퍼스] 17.Kotlin Coroutines & Flow ( 채널 기초 ) (0) | 2022.07.29 |
---|---|
[XX캠퍼스] 16.Kotlin Coroutines & Flow ( 런칭 ) (0) | 2022.07.27 |
[XX캠퍼스] 14.Kotlin Coroutines & Flow ( 예외처리하기 ) (0) | 2022.07.27 |
[XX캠퍼스] 13.Kotlin Coroutines & Flow ( 플래트닝 ) (0) | 2022.07.27 |
[XX캠퍼스] 12.Kotlin Coroutines & Flow ( Flow 결합하기 ) (0) | 2022.07.26 |