十五、錯誤處理操作(Error Handling Operators)
錯誤處理操作符可以用來幫助我們對 Observable
發出的 error
事件做出響應,或者從錯誤中恢復。
這里我們先自定義一個錯誤枚舉供后面使用:
enum MyError: Error {
case A
case B
}
1,catchErrorJustReturn
(1)基本介紹
- 當遇到
error
事件的時候,就返回指定的值,然后結束。
(2)使用樣例
let disposeBag = DisposeBag()
let sequenceThatFails = PublishSubject<String>()
sequenceThatFails
.catchErrorJustReturn("錯誤")
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
sequenceThatFails.onNext("a")
sequenceThatFails.onNext("b")
sequenceThatFails.onNext("c")
sequenceThatFails.onError(MyError.A)
sequenceThatFails.onNext("d")
運行結果如下:
2,catchError
(1)基本介紹
- 該方法可以捕獲
error
,并對其進行處理。 - 同時還能返回另一個
Observable
序列進行訂閱(切換到新的序列)。
(2)使用樣例
let disposeBag = DisposeBag()
let sequenceThatFails = PublishSubject<String>()
let recoverySequence = Observable.of("1", "2", "3")
sequenceThatFails
.catchError {
print("Error:", $0)
return recoverySequence
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
sequenceThatFails.onNext("a")
sequenceThatFails.onNext("b")
sequenceThatFails.onNext("c")
sequenceThatFails.onError(MyError.A)
sequenceThatFails.onNext("d")
運行結果如下:
3,retry
(1)基本介紹
- 使用該方法當遇到錯誤的時候,會重新訂閱該序列。比如遇到網絡請求失敗時,可以進行重新連接。
-
retry()
方法可以傳入數字表示重試次數。不傳的話只會重試一次。
(2)使用樣例
let disposeBag = DisposeBag()
var count = 1
let sequenceThatErrors = Observable<String>.create { observer in
observer.onNext("a")
observer.onNext("b")
//讓第一個訂閱時發生錯誤
if count == 1 {
observer.onError(MyError.A)
print("Error encountered")
count += 1
}
observer.onNext("c")
observer.onNext("d")
observer.onCompleted()
return Disposables.create()
}
sequenceThatErrors
.retry(2) //重試2次(參數為空則只重試一次)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
運行結果如下: