본문으로 바로가기

RxJava에 대해 알아보자 - 제4편 Error는 언제 나는지? 에러나면 어떻게 되는지?




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class DoOnError {
    public void run6() {
        Flowable.fromIterable(Arrays.asList(1201))
                .doOnComplete(() -> System.out.println("completed 6"))
                .map(item -> {
                    return 10 / item;
                })
                .doOnNext(item -> System.out.println("---next6---"))
                .doOnError(throwable -> System.out.println("---error6---"))
                .subscribe(item2-> System.out.println("subscribe:"+item2));
        System.out.println("---------finish--------");
    }
 
    public static void main(String[] args) {
        DoOnError doOnError = new DoOnError();
        doOnError.run6();
    }
 
}
cs


결과

---next6---

subscribe:10

---next6---

subscribe:5

---error6---

io.reactivex.exceptions.OnErrorNotImplementedException: The exception was not handled due to missing onError handler in the subscribe() method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | java.lang.ArithmeticException: / by zero

at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)

---- 중략 ----

---------finish--------



결론은 Flowable안에서 에러가 나도 Flowable 밖에 있는 코드는 실행 된다는 것이다.

그리고 Flowable에서 에러가 나면 그 뒤에 있는 item은 실행이 안된다. 1, 2, 0, 1 일 때 0에서 에러가 나면 남은 1을 실행이 안된다.



위 소스코드를 좀 설명을 해보면 Flowable(Observable)에 1, 2, 0, 1을 넣고 .subscribe()로 실행을 했을 때 어떻게 되는지 보는 코드이다.


일부러 에러가 나도록 만든 코드다. 왜냐하면 10을 위 4개의 숫자 1, 2, 0, 1로 나누는 코드인데 0으로 나눌려고 하면 divide by zero 에러가 나도록 되어있다.


이 코드의 목적은 rxjava가 한개의 collection에 있는 모든 데이터를 처리 할 때 잘 처리 하는지 보기 위함이다.

잘 처리한다는 것은 위에서 4개의 숫자를 넣었으면 4개의 결과가 나오고 5개의 숫자를 넣었으면 5개의 결과가 나와야 하는 것이다.


이를테면 고객 1000명에게 10,000원씩 나누어주는 코드를 rxjava로 짰을 때 에러가 나면 어떻게 되는지 아주 궁금하기 때문이다.


1
2
3
4
5
6
7
Flowable.just(12304)
      .map(item -> 10 / item)
      .doOnError(throwable -> System.out.println("doOnError:"+throwable))
      .doOnComplete(()-> System.out.println("complete"))
      .subscribe(item-> System.out.println("success item:"+item),
           item2-> System.out.println("error item:"+item2)
      );
cs


결과

success item:10

success item:5

success item:3

doOnError:java.lang.ArithmeticException: / by zero

error item:java.lang.ArithmeticException: / by zero


발행은 총 5개 1, 2, 3, 0, 4 이렇게 발행을 한다.

연산은 10 나누기 발행한 숫자를 한다.

일부러 에러가 나는 코드이다. 4번째 0으로 나누려고 할 때 어떻게 되는지 보기 위함이다.


0에서 에러가 났기 때문에 10/4는 실행이 되지 않았다.



1
2
3
4
5
6
7
8
Flowable.just(12304)
     .map(item -> 10 / item)
     .doOnNext(item -> System.out.println("doOnNext:"+item))
     .doOnError(throwable -> System.out.println("doOnError:"+throwable))
     .doOnComplete(()-> System.out.println("complete"))
     .subscribe(item-> System.out.println("success item:"+item),
         item2-> System.out.println("error item:"+item2)
     );
cs


결과

doOnNext:10

success item:10

doOnNext:5

success item:5

doOnNext:3

success item:3

doOnError:java.lang.ArithmeticException: / by zero

error item:java.lang.ArithmeticException: / by zero


이 코드는 .doOnNext()가 에러가 나면 계속 실행이 될건지 말건지 알아보는 코드이다.

에러가 나면 그 뒤에 있는 item은 실행이 되지 않는다.


댓글을 달아 주세요