一般來說,Observable不會拋異常。它會調用 `onError` 終止Observable序列,以此通知所有的觀察者發生了一個不可恢復的錯誤。
但是,也存在一些異常。例如,如果 `onError` 調用失敗了,Observable不會嘗試再次調用 `onError` 去通知觀察者,它會拋出 `RuntimeException`,`OnErrorFailedException` 或者 `OnErrorNotImplementedException`。
# 從錯誤中恢復的技術
So rather than _catch_ exceptions, your observer or operator should more typically respond to `onError` notifications of exceptions. There are also a variety of Observable operators that you can use to react to or recover from `onError` notifications from Observables. For example, you might use an operator to:
因此,你的觀察者或者操作符應該對異常發生時的 `onError` 通知做出合適的響應,而不是*捕獲*(_catch_)異常。很多操作符可用于對Observable發射的`onError`通知做出響應或者從錯誤中恢復,例如,你可以:
1. 吞掉這個錯誤,切換到一個備用的Observable繼續發射數據
2. 吞掉這個錯誤然后發射默認值
3. 吞掉這個錯誤并立即嘗試重啟這個Observable
4. 吞掉這個錯誤,在一些回退間隔后重啟這個Observable
你可以使用 [[異常處理操作符|Error Handling Operators]] 描述的操作符實現這些策略。
# RxJava特有的異常
<dl>
<dt><code>CompositeException</code></dt><dd>表示發生了多個異常。你可以使用異常的 <code>getExceptions()</code> 方法獲取單獨的異常。</dd>
<dt><code>MissingBackpressureException</code></dt><dd>表示一個訂閱者或者操作符試圖對一個不支持反壓操作的Observable應用該操作。可以參考 [[Backpressure]] 查找針對沒有實現反壓操作的Observable的解決辦法。</dd>
<dt><code>OnErrorFailedException</code></dt><dd>表示Observable嘗試調用觀察者的 <code>onError()</code> 方法,但是那個方法自己拋出了異常。</dd>
<dt><code>OnErrorNotImplementedException</code></dt><dd>表示一個Observable嘗試調用它的觀察者的<code>onError()</code> 方法,但是那個方法不存在。有多種方法可以消除這個錯誤:可以調整Observable使它不會到達這個錯誤條件,也可以在觀察者中實現一個<code>onError</code> 處理器, 或者使用其它的操作符在錯誤到達之前攔截這個 <code>onError</code> 通知。</dd>
<dt><code>OnErrorThrowable</code></dt><dd>觀察者們可以用這種形式傳遞異常給它們的觀察者們的 <code>onError()</code> 方法。相比標準的<code>Throwable</code>,這種Throwable包含更多的信息:錯誤本身和在錯誤發生時Observable的內部狀態。</dd>
</dl>
- ReactiveX
- Observables
- Single
- Subject
- Scheduler
- Operators
- 創建操作
- Create
- Defer
- Empty/Never/Throw
- From
- Interval
- Just
- Range
- Repeat
- Start
- Timer
- 變換操作
- Buffer
- FlatMap
- GroupBy
- Map
- Scan
- Window
- 過濾操作
- Debounce
- Distinct
- ElementAt
- Filter
- First
- IgnoreElements
- Last
- Sample
- Skip
- SkipLast
- Take
- TakeLast
- 結合操作
- And/Then/When
- CombineLatest
- Join
- Merge
- StartWith
- Switch
- Zip
- 錯誤處理
- Catch
- Retry
- 輔助操作
- Delay
- Do
- Materialize/Dematerialize
- ObserveOn
- Serialize
- Subscribe
- SubscribeOn
- TimeInterval
- Timeout
- Timestamp
- Using
- To
- 條件和布爾操作
- All/Contains/Amb
- DefaultIfEmpty
- SequenceEqual
- SkipUntil/SkipWhile
- TakeUntil/TakeWhile
- 算術和聚合操作
- Average/Concat/Reduce
- Max/Min/Count/Sum
- 異步操作
- 連接操作
- Connect
- Publish
- RefCount
- Replay
- 轉換操作
- 阻塞操作
- 字符串操作
- 按字母順序的操作符列表
- RxJava文檔和教程
- RxJava入門指南
- RxJava使用示例
- 實現自定義操作符
- 自定義插件
- Backpressure
- 錯誤處理
- Android模塊
- 參與開發
- 補充閱讀材料