공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
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 재시도 함수들에 대해 공부합니다.
이상입니다.