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 처리를 제어하기 위한 함수.



출력결과

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
.
.
.
반복


람다식으로



그냥 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/




Posted by 윤연식
,