안녕하세요. 메로나입니다.
오늘은 RxJava에서 에러를 처리하기 위한 연산자를 공부하겠습니다.
try ~ catch를 사용하면 되는 거 아닌가?라는 생각을 했지만, RxJava에서는 try ~ catch 사용을 하면 Exception이 나기 때문에 에러 처리 연산자가 따로 있다고 한다.. 흠..

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

onErrorResumeNext
에러가 발생했을 때 에러를 의미하는 Observable로 대체 가능
Observable로 대체할 수 있으므로 데이터 교체와 더불어 에러 처리를 위한 추가 작업을 할 수 있음.

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

예시
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 |
