Error Handling
๐จ Error Handling Operators โ catchError
, retry
, materialize
catchError
, retry
, materialize
โ์คํจ๋ ๋น์ฐํ๋ค. ๋ฌธ์ ๋ ๋ณต๊ตฌ๋ค.โ
RxSwift์ ์ค๋ฅ ์ฒ๋ฆฌ ์คํผ๋ ์ดํฐ๋ ์คํธ๋ฆผ ์ค๋ฅ๋ฅผ ๊ฐ๋ก์ฑ๊ณ , ๋์ฒดํ๊ฑฐ๋, ์ฌ์๋ํ ์ ์๊ฒ ํด ์ค๋๋ค. ์ฑ ์์ ์ฑ์ ํต์ฌ์ด๋ฏ๋ก ํ์คํ ์ดํดํด ๋ก์๋ค.
1๏ธโฃ ์ฃผ์ ์คํผ๋ ์ดํฐ ์์ฝ
catchError
์ค๋ฅ ๋ฐ์ ์ ๋์ฒด Observable๋ก ์ค์์น
(Error) -> Observable<R>
catchErrorJustReturn
ํน์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋์ฒด
(R)
retry(_ count:Int?)
์ค๋ฅ ๋ฐ์ ์ ์ฌ๊ตฌ๋ (๋ฌดํ or nํ)
Int?
retryWhen
์ค๋ฅ ์คํธ๋ฆผ์ ๋ณํํด ์กฐ๊ฑด ์ฌ์๋
(Observable<Error>) -> Observable<Void>
materialize
Event<Element>
๋ก ๋ํ(๊ฐยท์๋ฃยท์ค๋ฅ ํฌํจ)
โ
dematerialize
๋ฐ๋ ์ฐ์ฐ
โ
2๏ธโฃ ์ค์ ์ค๋ํซ
A. catchError
โ Offline Placeholder
catchError
โ Offline Placeholderapi.fetchNews()
.catchError { _ in localCache.news() }
.bind(to: tableView.rx.items(...))
B. retry
โ ๋คํธ์ํฌ ์ฌ์๋ 3ํ
retry
โ ๋คํธ์ํฌ ์ฌ์๋ 3ํapi.post(data)
.retry(3)
.subscribe(onError: showToast)
C. retryWhen
โ ์ง์ ๋ฐฑ์คํ ์ฌ์๋
retryWhen
โ ์ง์ ๋ฐฑ์คํ ์ฌ์๋api.fetch()
.retryWhen { errors in
errors.enumerated().flatMap { attempt, error -> Observable<Int> in
guard attempt < 3 else { return Observable.error(error) }
let delay = pow(2.0, Double(attempt))
return Observable<Int>.timer(.seconds(Int(delay)), scheduler: MainScheduler.instance)
}
}
D. materialize
โ ์ค๋ฅ๋ฅผ UI ์ด๋ฒคํธ๋ก ํ์
materialize
โ ์ค๋ฅ๋ฅผ UI ์ด๋ฒคํธ๋ก ํ์api.fetch()
.materialize()
.subscribe(onNext: { event in
switch event {
case .next(let value): render(value)
case .error(let e): showError(e)
case .completed: break
}
})
3๏ธโฃ ํจํด ์์ฝ
๋คํธ์ํฌ ๋ค์ด โ ๋ก์ปฌ ์บ์ ๋์ฒด
catchError
์คํธ๋ฆผ ์ ์ง & Fallback
Transient API ์คํจ ์ฌ์๋
retry(3)
๊ฐ๋จ ๋ฐ๋ณต
HTTP 429 RateโLimit ์ฌ์๋ ํค๋ ๋ฐ์
retryWhen
์๋ฒ ์ ๊ณต ์๊ฐ๊น์ง delay
์ฌ์ฉ์ ์๋ฆผ ์์ด ์คํจ ๋ฌด์
catchErrorJustReturn(defaultValue)
UX ๊ฐ๊ฒฐ
4๏ธโฃ Error vs Completion ํ๋ฆ
catchError
๋ก ๋์ฒดํ Observable์ด ์๋ฃ๋๋ฉด ์์ ์คํธ๋ฆผ๋ ์๋ฃ.retry
๋ source Observable์ ์ฌ๊ตฌ๋ ํ๊ณ , ์๋ฌ๊ฐ ์๋ ์ ์ ์๋ฃ ์ ๊ทธ ์ฆ์ ์๋ฃ.
retryWhen
๋ด๋ถ Observable์ดonCompleted
ํ๋ฉด ์ฌ์๋ ์ข ๋ฃ;onError
๋ฉด ์ ํ.
5๏ธโฃ pitfalls
retry ๋ฌดํ ๋ฃจํ: ์๋ฒ ์๊ตฌ ๋ค์ด ์ ๋ฐฐํฐ๋ฆฌ ์๋ชจ โ
retry(โ)
๋์retry(3)
.catchErrorJustReturn ๋จ๋ฐ: ์๋ฌ ๋ก๊น ๋๋ฝ โ ๋๋ฒ๊น ์ด๋ ค์.
materialize ํ
dematerialize
๊น๋นก: ์ด๋ฒคํธ ํ์ ์์ด๋ฒ๋ ค ์ฒด์ธ ์ค๋ฅ.
6๏ธโฃ Mini Quiz
retryWhen
๋ด๋ถ Observable์ด.next()
์์ด.completed
๋ง ํ๋ฉด ๊ฒฐ๊ณผ๋?catchError
์onErrorResumeNext
์ฐจ์ด๋?materialize
๋ ์คํธ๋ฆผ์share()
ํ ๋ค์dematerialize
ํ ๋ ์ฃผ์ํ ์ ?
๐ Operators ์ฑํฐ ๋! ์ด์ ์ฌํ ํ์ต์ผ๋ก ๊ฐํํด ๋ณด์ธ์. ๐
Last updated