RxJava2, RxAndroid2

[RxJava2] RxJava의 예외처리1 : onErrorReturn(), onError(), onErrorReturnItem(), onErrorResumeNext()

알통몬_ 2018. 10. 11. 12:02
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


원래 자바에서는 예외처리를 위해

try{} catch() {} 블록을 사용합니다.

하지만 RxJava에서는 try{} catch{} 블록을 사용하지 않습니다.


RxJava에 try{} catch{}문을 사용해보면 아래와 같은데요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package rx.java.chapter07;
 
import io.reactivex.Observable;
 
public class UseTryCatchExcetionEx {
 
    public static void main(String[] args) {
 
        Observable<String> src = Observable.<String>create(emitter -> {
            emitter.onNext("1");
            emitter.onError(new Exception("Error occurred"));
            emitter.onNext("3");
            emitter.onComplete();
        });
        try {
            src.subscribe(System.out::println);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
 
}
 
cs

예제를 실행시켜보면 에러가 발생합니다.


내부적으로 구조를 살펴보면 Observable을 생성해 onError(new Exception("..."));

을 호출하면 subscribe(onNext, onError)의 함수 인자로 넘긴 onError 인자로

전달하기 때문에 try{} catch{} 문은 RxJava에서 활용 X


다른 방식으로 예외처리를 해여함.


onErrorReturn()

RxJava에서는 에러도 하나의 데이터로 보는 것이 적절함.

즉, 예외 처리하는 첫 번째 방법은 예외가 발생했을 때 에러를 의미하는

다른 데이터로 대체하는 것.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package rx.java.chapter07;
 
import io.reactivex.Observable;
 
public class HandledException {
 
    public static void main(String[] args) {
        
        Observable<Integer> src = Observable.just("1000""$1000""10000")
                .map(data -> Integer.parseInt(data))
                .onErrorReturn(e -> {
                    if(e instanceof NumberFormatException) {
                        e.printStackTrace();
                    }
                    return -1;
                });
        
        src.subscribe(datas -> {
            if(datas < 0) {
                System.out.println("잘못된 데이터입니다.");
                return;
            }
            System.out.println("value => " + datas);
        });
    }
    
}
 
cs


onError() 에서 예외처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package rx.java.chapter07;
 
import io.reactivex.Observable;
 
public class HandledException {
 
    public static void main(String[] args) {
        
        Observable<Integer> src = Observable.just("1000""$1000""10000")
                .map(data -> Integer.parseInt(data));
 
        
        src.subscribe(datas -> System.out.println("value => " + datas),
            e -> {
                if(e instanceof NumberFormatException) {
                    e.printStackTrace();
                }
                System.out.println("잘못된 데이터입니다.");    
        });
    }
    
}
 
cs


onErrorReturnItem()

onErrorReturn() 과 비슷한 함수입니다.

Throwable 객체를 인자로 전달하지 않아서 코드가 간결해지는 장점이 있고,

예외 종류를 확인할 수 없다는 단점이 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package rx.java.chapter07;
 
import io.reactivex.Observable;
 
public class HandledException {
 
    public static void main(String[] args) {
        
        Observable<Integer> src = Observable.just("1000""$1000""10000")
                .map(data -> Integer.parseInt(data))
                .onErrorReturnItem(-1);
        
        src.subscribe(data -> {
            if(data < 0) {
                System.out.println("잘못된 데이터입니다.");
                return;
            }
            System.out.println("value =>" + data);
        });
    }
    
}
 
cs


onErrorResumeNext()

에러 발생 시 내가 원하는 Observable러 대체함.

ex) 에러 발생 시 관리자에게 메일을 보낸다든가 하는 처리가 가능.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package rx.java.chapter07;
 
import io.reactivex.Observable;
 
public class OnErrorResumeNextEx {
 
    public static void main(String[] args) {
        
        String[] strArray = {"100","1000","1만"};
        
        Observable<Integer> srcInt = Observable.defer(() -> {
            System.out.println("Send mail to Admin");
            return Observable.just(-1);
        });
        
        Observable<Integer> src1 = Observable.fromArray(strArray)
                .map(Integer::parseInt)
                .onErrorResumeNext(srcInt);
        
        src1.subscribe(data -> {
            if(data <0) {
                System.out.println("잘못된 데이터입니다.");
                return;
            }
            System.out.println("value => " + data);
        });
        
    }
 
}
 
cs


다음 포스팅에서는 예외처리2 재시도 함수들에 대해 공부합니다.

이상입니다.




반응형