Observer 나 Subscriber 객체에 onError() 함수를 override하면 생산자에서 발생하는 error를 전달받을수 있습니다.
하지만 onError()을 사용하지 않고, 중간 연산자로 error을 처리하는 방법에 대해서 알아봅니다.
먼저 기본적으로 에러를 발생시키도록 코드를 작성합니다.
fun main(args: Array<String>) {
Observable.range(1, 10)
.map {
if (it == 5) {
throw Exception("Error!!!")
} else {
it
}
}
.subscribeBy (
onNext = { println(it) },
onError = { e -> println(e) }
)
}
예상대로 5를 찍으면 exception을 throw 합니다.
1
2
3
4
java.lang.Exception: Error!!!
onErrorReturnItem | onErrorReturn
에러가 발생시 특정값으로 교체하여 전달합니다.
물론 발생시 Observable의 생산은 중단됩니다.
fun main(args: Array) {
Observable.range(1, 10)
.map {
if (it == 5) {
throw Exception("Error!!!")
} else {
it
}
}
.onErrorReturnItem(-1)
// .onErrorReturn { e: Throwable -> -1 }
.subscribeBy(onNext = { println(it) },
onError = { e -> println(e) })
}
결과는 아래와 같습니다.
1
2
3
4
-1
Error 발생시 아이템을 -1로 반환하도록 onErrorReturnItem을 사용했습니다.
따라서 이를 수신받는 함수는 onNext() 입니다 . (onError()이 아닙니다.)
또한 주석을 풀고 onErrorReturn{...} 를 사용하여 Function<T,R>을 람다식으로 넣어줘도 됩니다.
onErrorResumeNext
fun main(args: Array) {
Observable.range(1, 10)
.map {
if (it == 5) {
throw Exception("Error!!!")
} else {
it
}
}
.onErrorResumeNext(Observable.just(3, 2, 1))
.subscribeBy(onNext = { println(it) },
onError = { e -> println(e) })
}
결과
1
2
3
4
3
2
1
retry
fun main(args: Array<String>) {
val ob = Observable.range(1, 10)
.map {
if (it == 5) {
throw Exception("Error!!!")
} else {
it
}
}
ob.retry(2)
.subscribeBy(onNext = { println(it) },
onError = { e -> println(e) })
println("---- retry with condition ----")
ob.retry { retryCnt, e ->
println("retry cnt:$retryCnt")
if (retryCnt > 2) false else true
}
.subscribeBy(onNext = { println(it) },
onError = { e -> println(e) })
}
단순히 retry(반복횟수)로 반복을 정의할 수 도 있으며, retry { retryCount, Throwable -> Boolean} 인 람다식으로 재시도 여부를 판단할 수 있습니다.
1
2
3
4
1
2
3
4
1
2
3
4
java.lang.Exception: Error!!!
---- retry with condition ----
1
2
3
4
retry cnt:1
1
2
3
4
retry cnt:2
1
2
3
4
retry cnt:3
java.lang.Exception: Error!!!
retryUntil
fun main(args: Array<String>) {
val ob = Observable.range(1, 10)
.map {
if (it == 5) {
throw Exception("Error!!!")
} else {
it
}
}
var retryCnt = 0
ob.retryUntil {
if (retryCnt == 3) {
true
} else {
println("Retry!!!")
retryCnt++
false
}
}
.subscribeBy(onNext = { println(it) },
onError = { e -> println(e) })
}
결과
1
2
3
4
Retry!!!
1
2
3
4
Retry!!!
1
2
3
4
java.lang.Exception: Error!!!
'개발이야기 > Kotlin' 카테고리의 다른 글
[RxKotlin] Reactive 코틀린 #11 - using을 이용한 자원 해제 (0) | 2019.12.23 |
---|---|
[RxKotlin] Reactive 코틀린 #10 - 병렬처리를 위한 Scheduler (2) | 2019.12.20 |
[RxKotlin] Reactive 코틀린 #8 - skip, take operators (0) | 2019.12.19 |
[RxKotlin] Reactive 코틀린 #7 - Composing operators (2) | 2019.12.18 |
[RxKotlin] Reactive 코틀린 #6 - Basic operators (0) | 2019.12.16 |