Error Handling Operator
-onErrorReturnItem
-onErrorReturn
-onErrorResumeNext
-onExceptionResumeNext
-Retry
-RetryUntil
-RetryWhen
Materialize/Dematerialize
onErrorReturnItem
-에러가 발생하면 대체 항목을 방출
Observable.error<String>(RuntimeException())
.onErrorReturnItem("return item if error")
.subscribe(::println)
에러를 발행하지 않고, 대체값을 발행한 뒤 정상종료 된다.
onErrorReturn
-에러가 발생하면 대체 항목을 방출
Observable.error<String>(RuntimeException())
.onErrorReturn { error ->
if (error is HttpTimeoutException) {
"timeout!"
} else if (error is HttpRetryException) {
"retry failure"
} else {
"unkown"
}
}
.subscribe(::println)
에러의 타입에 따라 값을 다르게 반환할 수 있습니다.
onErrorResumeNext
-에러가 발생하면 대체 Observable을 방출
Observable.error<Int>(HttpException(200))
.onErrorResumeNext { error: Throwable ->
when(error){
is HttpException -> Observable.just(error.code)
else -> Observable.error(error)
}
}
.subscribe(::println)
특정 에러에 대해서만 처리하고 나머지 에러는 그대로 발행할 수도 있다.
onExceptionResumeNext
-에러가 발생하면 대체 Observable을 방출
Observable.error<Int>(RuntimeException())
.onExceptionResumeNext { observer ->
Observable.range(1, 10)
.subscribe(observer)
}
.subscribe(::println, ::println)
에러 발생이후 구독할 Observable을 정의한다
retry
-에러가 발생하면 Observable을 재구독
Observable.error<Int>(RuntimeException())
.retry()
.subscribe(::println)
무한 Exception 루프에 빠지고 싶으면 이렇게 짜면 된다
Observable.error<Int>(RuntimeException())
.doOnError(Throwable::printStackTrace)
.retry(3)
.subscribe(::println)
3번만 재구독한다