본문 바로가기

RxJava

[RxJava] 에러 처리 연산자

안녕하세요. 메로나입니다.

 

오늘은 RxJava에서 에러를 처리하기 위한 연산자를 공부하겠습니다.

 

try ~ catch를 사용하면 되는 거 아닌가?라는 생각을 했지만, RxJava에서는 try ~ catch 사용을 하면 Exception이 나기 때문에 에러 처리 연산자가 따로 있다고 한다.. 흠..

Exception이 나면서 앱이 꺼진 이미지

onErrorReturn
  • 에러가 발생했을 때 에러를 의미하는 데이터로 대체 가능
  • onErrorReturn()을 호출하면 onError 이벤트는 발생하지 않음

마블 다이어그램 - onErrorReturn()

 

onErrorResumeNext

에러가 발생했을 때 에러를 의미하는 Observable로 대체 가능

Observable로 대체할 수 있으므로 데이터 교체와 더불어 에러 처리를 위한 추가 작업을 할 수 있음.

마블다이어그램 - onErrorResumeNext()

 

retry
  • 데이터 통지 중 에러가 발생했을 때, 데이터 통지를 재시도함
  • onError 이벤트가 발생하면 subscribe()를 다시 호출하여 재구독함
  • 에러가 발생한 시점에 통지에 실패한 데이터만 다시 통지되는 것이 아니라 처음부터 다시 통지함.

마블다이어그램 - retry()

 

예시
public static void main(String[] args) {
        Observable.just(10, 12, 15, 16)
                .zipWith(Observable.just(1, 2, 0, 4), (a, b) -> { // zipWith 연산자를 사용하여 두 Observable의 데이터를 조합
                    int result;
                    try {
                        result = a / b;
                    } catch (ArithmeticException e) {
                        System.out.println("Error: " + e.getMessage());
                        throw e;
                    }
                    return result;
                })
                .retry(3) // 3번까지 재시도
                .onErrorReturn(throwable -> -1) // 재시도 3번 후에도 에러가 발생하면 -1을 반환
                .subscribe(
                        data -> System.out.println("Result: " + data),
                        error -> System.out.println("Error: " + error.getMessage()),
                        () -> System.out.println("Complete")
                );

        try {
            Thread.sleep(10000); // main thread가 종료되지 않게 10초 대기
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    Result: 10
Result: 6
Error: / by zero
Result: 10 // 처음부터 시작-- 
Result: 6
Error: / by zero
Result: 10 // 처음부터 시작-- 
Result: 6
Error: / by zero
Result: 10 // 처음부터 시작-- 
Result: 6
Error: / by zero
Result: -1
Complete

 

자주 사용할 것 같아서 익혀두면 좋을 것 같습니다.

20000~

'RxJava' 카테고리의 다른 글

[RxJava] 조건과 불린 연산자  (0) 2025.02.22
[RxJava] 유틸리티 연산자  (0) 2025.02.21
[RxJava] 데이터 결합 연산자  (0) 2025.02.11
[RxJava] RxJava 퀴즈 문제  (0) 2025.02.09
[RxJava] 데이터 변환 연산자  (0) 2025.02.06