MapleStory Finger Point

[RxSwift] RxSwift에서는 에러 처리를 어떻게 할까?

2024. 4. 13. 15:47iOS Development/RxSwift

앱에서 가장 흔하게 발생할 수 있는 에러 상황은

  • 인터넷 연결 없음(오프라인 상태),
  • 잘못된 입력(잘못된 타입, 길이, 크기, 내용 등)
  • API, HTTP 에러(400, 500, JSON Codable 등)

 

등이 있다. 그렇다면 RxSwift에서는 이런 에러 상황에서 어떻게 처리를 할까?

 

 


 

RxSwift의 에러 관리

catch

에러를 잡아서 처리

클로저를 받아서 새로운 형태의 Observable를 반환

func catch(_ handler:) → RxSwift.Observable<Self.Element>
enum MyError: Error {
    case anError
    case criticalError
}
Observable.create {
    $0.onError(MyError.anError) // 오류 발생
    return Disposables.create()
}
.catch { error in
    switch error as! MyError {
    case .anError:
        return .just("어떤 오류")
    case .criticalError:
        return .just("치명적인 오류")
    }
}
.subscribe {
    print($0) // "어떤 오류" 출력
}
.disposed(by: disposeBag)

 

catchAndReturn

에러를 무시하고 이전에 선언해 둔 값을 반환함 → 모든 에러에 대해 동일한 값 반환

func catchAndReturn(_ element: Self.Element) → RxSwift.Observable<Self.Element>
Observable.create {
    $0.onError(MyError.anError)
    return Disposables.create()
}
.catchAndReturn("에러 싫어")
.subscribe {
    print($0) // "에러 싫어" 출력
    // next("에러 싫어")
    // completed
 }
 .disposed(by: disposeBag)

 

retry

에러 발생 시 특정 횟수나 상황이 발생할 때까지 계속 재시도시켜서 원하는 결과로 반환

func retry() → RxSwift.Observable<Self.Element>
Observable.create {
    $0.onError(MyError.anError)
    return Disposables.create()
}
.retry()
.subsribe {
    print($0)
}
.disposed(by: disposeBag)

 

retry(_ maxAttemptCount:)

재시도 횟수 제한함