error handling
subscribe 에서 에러 처리
출력결과
subscribe
on next: emit 1
on next: emit 2
error:java.lang.Throwable
람다식으로
onError을 정확하게 해주지 않으면 Crash가 발생한다.
출력결과
subscribe
on next: emit 1
on next: emit 2
Crash!!
by rx.exceptions.OnErrorNotImplementedException
Error 캐치
onErrorReturn
Observable 체인 안에서 발생한 Error 를 캐치해서, 대체할 Object로 변환하는 것으로 subscriber에 Error가 전달되는 것을 막을 수 있다.
출력결과
subscribe
on next: emit 1
on next: emit 2
on next: return
completed
람다식으로
OnErrorResumeNext
Observable 체인에서 발생한 Error를 캐치해서, 그 안에서 다시 한 번 Observable를 호출하면 에러시 대체 Stream을 반환할 수 있다.
출력결과
subscribe
on next: emit 1
on next: emit 2
on next: resume 1
on next: resume 2
completed
람다식으로
Retry
Error가 일어났을 때, 자동으로 subscribe를 다시 해준다.
출력결과
subscribe
on next: emit 1
on next: emit 2
subscribe
on next: emit 1
on next: emit 2
subscribe
on next: emit 1
on next: emit 2
.
.
.
성공할때까지 계속... 무한루프 될 가능성이 있으므로 유의해야 한다.
Retry 횟수 제한
출력결과
subscribe
on next: emit 1
on next: emit 2
subscribe
on next: emit 1
on next: emit 2
subscribe
on next: emit 1
on next: emit 2
subscribe
on next: emit 1
on next: emit 2
error:java.lang.Throwable
Retry 좀 더 구체적인 설정
출력결과
subscribe
on next: emit 1
on next: emit 2
subscribe
on next: emit 1
on next: emit 2
subscribe
on next: emit 1
on next: emit 2
error:java.lang.Throwable
람다식으로
RetryWhen
보다 세밀하게 retry 처리를 제어하기 위한 함수.
그냥 Error인채로 종료
출력결과
subscribe
on next: emit 1
on next: emit 2
error:java.lang.Throwable
(error에 대한 별도의 처리를 하지 않았을 때와 동일한 결과)
Error에 대한 처리를 하지 않고 Complete하기
출력결과
subscribe
on next: emit 1
on next: emit 2
completed
3번 retry하고 종료
출력결과
subscribe
on next: emit 1
on next: emit 2
subscribe
on next: emit 1
on next: emit 2
subscribe
on next: emit 1
on next: emit 2
completed
이 경우, 앞의 retry(count) 함수와의 차이는 retry(count)에서는 retry 횟수가 제한에 도달한 후에 error로 종료합니다만, 이 케이스는 completed 에서 종료한다는 점이다.
3초 retry를 3번 하고 종료하기
출력결과
subscribe
on next: emit 1
on next: emit 2
// 3초 후
subscribe
on next: emit 1
on next: emit 2
// 3초 후
subscribe
on next: emit 1
on next: emit 2
completed
람다식으로
에러 핸들러를 구독하고 제공하는지 항상 확인해야 합니다. 그렇지 않으면 특히 스케줄러를 적용할 때 스택 트레이스에 아무것도 없을 수 있습니다. 물론 RxJava 절에서 뭔가 잘못됐다고 알려주긴 하지만 어디서 발생했는지 찾을 방법이 없습니다. 항상 에러 콜백을 사용하고, 에러가 발생한다면 에러를 로그로 남겨서 예상치 못한 오류를 기록해야 합니다.
RxLint : https://bitbucket.org/littlerobots/rxlint
참고자료
http://pluu.github.io/blog/rxjava/2015/12/11/rxjava-error/
http://realignist.me/code/2016/05/29/rxjava-on-android.html
http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/
https://realm.io/kr/news/mobilization-hugo-visser-rxjava-for-rest-of-us/