[RxSwift] - Error 관리(Catch, Retry)

sun02·2022년 2월 19일
0

RxSwift

목록 보기
9/12

RxSwift에서 에러를 관리하는 방법에는

  • Catch
  • Retry

가 있습니다.

1. Catch

: 기본값(defaultValue)로 error를 복구합니다.
에러 없이 sequence를 지속하여 onError알림에서 복구합니다.

Catch 연산자는 소스 observable에서 onError알림이 오면,
관찰자에게 전달하지 않고 이를 가로채서 다른 itemdlsk sequence item으로 대체하여 결과 observable이 정상적으로 종료, 혹은 종료되지 않도록 합니다.

public func `catch`(_ handler: @escaping (Error) throws -> RxSwift.Observable<Self.Element>) -> RxSwift.Observable<Self.Element>
enum MyError: Error {
    case error1
    case error2
}

Observable.create {
    $0.onError(MyError.error1)
    return Disposables.create()
}
.catch { error in
    switch error as! MyError {
    case .error1:
        return .just("error1")
    case .error2:
        return .just("error2")
    }
}
.subscribe {
    print($0)
}
.disposed(by: disposeBag)
  • error가 발생했을 때 그 종류가 error1이라면 catch가 이를 받아 just를 사용해서 observable<"error1"> 를 반환합니다.

// 실행 시 다음을 출력합니다.
error1

+ CatchAndReturn

 public func catchAndReturn(_ element: Self.Element) -> RxSwift.Observable<Self.Element>
  • element: 에러가 발생한 경우 observable sequence의 마지막 item
enum MyError: Error {
    case error1
    case error2
}

Observable.create {
    $0.onError(MyError.error1)
    return Disposables.create()
}
.catchAndReturn("error")
.subscribe {
    print($0)
}
.disposed(by: disposeBag)
  • error의 종류에 관계없이 "error"를 next 이벤트로 반환합니다.

// 실행시 다음을 출력합니다.
next(error)
completed

만약 구독 전에 catchAndReturn을 해주지 않았다면

Unhandled error happened: error1

이와 같이 출력됩니다.

2. Retry

: 제한적, 혹은 무제한적으로 재시도 합니다.
만약 소스 observable에서 error가 발생한다면 오류 없이 완료(종료)되기를 바라며 재구독합니다

Retry 연산자는 onError 알림이 오면, 관찰자에게 이를 전달하기보다 해당 sequence를 오류 없이 종료할 수 있도록 소스 observable을 재구독하여 다시 한번 기회를 제공합니다.

Retry는 sequence가 error로 인해 종료되더라도 관찰자에게 항상 onNext를 전달하기때문에 중복 방출이 발생할 수 있습니다.

public func retry() -> RxSwift.Observable<Self.Element>

  • 다음과 같이 retry() 연산자를 사용하면, 계속해서 재시도합니다.

따라서 다음과 같이 재시도 횟수를 제한해줄 수도 있습니다.

  • retry(1000)이므로 1000번 재시도 하였지만

소스 observable은 계속해서 error만 전달하기 때문에

Unhandled error happened: error1

를 출력합니다.

1개의 댓글

comment-user-thumbnail
2022년 2월 19일

sun02님 안녕하세요!!

저는 이제 막 swift를 독학으로 공부중인 한 학생입니다.
혹시 RxSwift를 어떤 교재?나 방법으로 공부하는지 알 수 있을까요??????

답글 달기