前言
本節(jié)中主要介紹錯(cuò)誤處理
// 定義一個(gè)錯(cuò)誤
public enum TestError : Error {
case test
}
Error Handling Operators
-
catchErrorJustReturn
遇到錯(cuò)誤時(shí)限拋出預(yù)設(shè)的next事件髓梅,然后結(jié)束即Complete,但是不會(huì)發(fā)出錯(cuò)誤事件
example("catchErrorJustReturn") {
let disposeBag = DisposeBag()
let sequenceThatFails = PublishSubject<String>()
sequenceThatFails
.catchErrorJustReturn("??")
.subscribe { print($0) }
.disposed(by: disposeBag)
sequenceThatFails.onNext("??")
sequenceThatFails.onNext("??")
sequenceThatFails.onNext("??")
sequenceThatFails.onNext("??")
sequenceThatFails.onError(TestError.test)
}
// 控制臺(tái)打印的結(jié)果:
--- catchErrorJustReturn example ---
next(??)
next(??)
next(??)
next(??)
next(??)
completed
-
catchError
遇到錯(cuò)誤會(huì)進(jìn)入走閉包的分支,然后切換到閉包中返回的預(yù)先設(shè)置的其他的觀察序列
example("catchError") {
let disposeBag = DisposeBag()
let sequenceThatFails = PublishSubject<String>()
let recoverySequence = PublishSubject<String>()
sequenceThatFails
.catchError {
print("Error:", $0)
return recoverySequence
}
.subscribe { print($0) }
.disposed(by: disposeBag)
sequenceThatFails.onNext("??")
sequenceThatFails.onNext("??")
sequenceThatFails.onNext("??")
sequenceThatFails.onNext("??")
sequenceThatFails.onError(TestError.test)
recoverySequence.onNext("??")
}
// 控制臺(tái)打印的結(jié)果:
--- catchError example ---
next(??)
next(??)
next(??)
next(??)
Error: test
next(??)
-
retry
遇到錯(cuò)誤以后扭弧,會(huì)嘗試通過(guò)再次訂閱序列,如果在遇到錯(cuò)誤就再訂閱狂秦,如此周而復(fù)始
官方示例程序
example("retry") {
let disposeBag = DisposeBag()
var count = 1
let sequenceThatErrors = Observable<String>.create { observer in
observer.onNext("??")
observer.onNext("??")
observer.onNext("??")
if count == 1 {
observer.onError(TestError.test)
print("Error encountered")
count += 1
}
observer.onNext("??")
observer.onNext("??")
observer.onNext("??")
observer.onCompleted()
return Disposables.create()
}
sequenceThatErrors
.retry()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺(tái)打印的結(jié)果:
--- retry example ---
??
??
??
Error encountered
??
??
??
??
??
??
為了展示周而復(fù)始的過(guò)程关带,我修改了一下代碼
example("retry") {
let disposeBag = DisposeBag()
var count = 1
let sequenceThatErrors = Observable<String>.create { observer in
observer.onNext("??")
observer.onNext("??")
observer.onNext("??")
/***** 在增加一次錯(cuò)誤,看其如何處理 ***/
if count == 2{
observer.onError(TestError.test)
print("Error encountered")
count += 1
}
/*********************************/
if count == 1 {
observer.onError(TestError.test)
print("Error encountered")
count += 1
}
observer.onNext("??")
observer.onNext("??")
observer.onNext("??")
observer.onCompleted()
return Disposables.create()
}
sequenceThatErrors
.retry()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺(tái)打印的結(jié)果:
--- retry example ---
??
??
??
Error encountered
??
??
??
Error encountered*****
??
??
??
??
??
??
-
retry(_:)
和retry的功能一直褥傍,參數(shù)是限定了重復(fù)訂閱的次數(shù)
example("retry maxAttemptCount") {
let disposeBag = DisposeBag()
var count = 1
let sequenceThatErrors = Observable<String>.create { observer in
observer.onNext("??")
observer.onNext("??")
observer.onNext("??")
if count < 5 {
observer.onError(TestError.test)
print("Error encountered")
count += 1
}
observer.onNext("??")
observer.onNext("??")
observer.onNext("??")
observer.onCompleted()
return Disposables.create()
}
sequenceThatErrors
.retry(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
// 控制臺(tái)打印的結(jié)果:
--- retry maxAttemptCount example ---
??
??
??
Error encountered
??
??
??
Error encountered
??
??
??
Error encountered
``
[下一篇:RxSwift文檔翻譯9 - Debugging Operators ](http://www.reibang.com/p/75aefe7dc484)