RxJava Error handling operators

HEETAE HEO·2022년 8월 6일
0
post-thumbnail

Observer나 Subscriber 객체에 onError() 함수를 override하면 생산자에서 발생하는 error를 전달받을 수 있습니다.

onError() Consumer

Observable에서 에러가 발생하면 Emitter.onError() 이벤트를 발행하는 것을 설명한 적 있습니다. subscribe()안에 onNext() Consumer 뿐만 아니라 onError() Consumer 를 넣어줌으로써, onError()를 구독할 수 있습니다. 가장 일반적인 에러 핸들링 기법입니다.

fun main() {
	Observable.just("1","2","A","3")
    	.map{ it.toInt() }
        .subscribe(System.out::println){
        	println(it) // onError() Consumer
        }
   }
1
2
java.lang.NumberFormatException: For input string: "A"

mao() 안에서 String을 Int로 바꾸는 동작을 수행하였습니다. 그렇기에 1과 2의 경우에는 정상적인 동작을 수행하였지만 A가 들어온 상황에서는 Int로 바꿀 수 없어 Error가 발생하게 됩니다. 또한 Error가 발생한 이후에는 데이터가 더 이상 발행이 되지 않습니다.

이것이 Consumer를 넘겨줌으로써 구현한 에러 핸들링입니다. 이외에 오류 처리 전용 연사자를 활용하는 방법들도 있습니다.

onErrorReturn()

onErrorReturn()의 경우 Error가 발생했을 때 다른 Observable을 구독하도록 해줄 수 있습니다.

fun main() {
	    Observable.just("1", "2", "A", "3")
        .map { it.toInt() }
        .onErrorReturn { -1 }
        .subscribe { x: Int? -> println(x) }
}
1
2
-1

onErrorResumeNext()

만약 Error가 발생하게 된다면 해당 데이터 스트림을 종료하고 기입해준 다른 Observable로 데이터 스트림을 교체하여 데이터를 발행하게 됩니다.

fun main(){
	    Observable.just("1", "2", "A", "3")
        .map { it.toInt() }
        .onErrorResumeNext(Observable.just(10, 20, 30))
        .subscribe(System.out::println)
}
1
2
10
20
30

그렇다면 onErrorReturn()과 onErroResumeNext()의 차이는 무엇일까?
onErrorReturn()의 경우에는 Error발생시 특정 동작 하나만 가능하게 한다면 onErrorResumeNext()의 경우에는 다른 Observable을 이어서 해주기 때문에 데이터를 쭉 발행해줍니다.

retry()

retry의 뜻은 재시도로 retry()메서드 또한 직역과 동작이 같습니다. 말 그대로 데이터 발행을 재시도하게 합니다. Error가 발생할 경우 다시 해당 Observable을 구독합니다. 계속 retry할 경우 무한루프에 빠질 수 있기에 횟수를 지정해줍니다.

fun main() {
    Observable.just("1", "2", "A", "3")
        .map { it.toInt() }
        .retry(3)
        .onErrorReturn { -1 }
        .subscribe(System.out::println)
}
1
2
1
2
1
2
1
2
-1

references

https://reactivex.io/documentation/operators.html#error
https://tourspace.tistory.com/291
https://velog.io/@haero_kim/RxJava-Observable-%EC%98%A4%EB%A5%98-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글