エラーハンドリング(Error)オペレーター
概要
R3 は従来の Reactive ライブラリとは異なる 二層式エラーモデル を採用しています。
| 通知 | 種別 | シーケンスへの影響 |
|---|---|---|
OnErrorResume | 非致命的エラー | シーケンスは 継続 する。後続の要素を引き続き受け取れる |
OnCompleted(Result.Failure) | 致命的エラー | シーケンスは 終了 する。以降の要素は発行されない |
従来の OnError に相当するのは OnCompleted(Result.Failure) です。一方、OnErrorResume は「エラーは発生したが、ストリーム自体はまだ有効である」ことを表します。この二層構造により、一時的な障害と回復不能な障害を明確に区別して処理できます。
オペレーター一覧
| オペレーター | 説明 |
|---|---|
| Catch | ソースが失敗で完了した際に、代替 Observable に切り替える |
| IgnoreOnErrorResume | OnErrorResume 通知を無視して処理を継続する |
| OnErrorResumeAsFailure | 最初の OnErrorResume を致命的エラーに変換してシーケンスを終了する |
比較表
| 特性 | Catch | IgnoreOnErrorResume | OnErrorResumeAsFailure |
|---|---|---|---|
| 対象とするエラー | 致命的エラー (OnCompleted(Result.Failure)) | 非致命的エラー (OnErrorResume) | 非致命的エラー (OnErrorResume) |
| エラー時の動作 | 代替 Observable に切り替え | エラーを無視して継続 | 致命的エラーに昇格して終了 |
| シーケンスの継続 | 代替シーケンスで継続 | そのまま継続 | 終了する |
| 主な用途 | フォールバック・リカバリ | 一時的なエラーの抑制 | 最初のエラーで即座に停止 |
使い分けガイド
致命的エラーから回復したい場合
ソースシーケンスが OnCompleted(Result.Failure) で終了した際に、別の Observable に切り替えて処理を継続したい場合は Catch を使用します。例えば、メインのデータソースが失敗した場合にキャッシュやデフォルト値で代替する場面に適しています。
非致命的エラーを無視したい場合
OnErrorResume で通知される一時的なエラーを無視し、後続の要素だけを処理したい場合は IgnoreOnErrorResume を使用します。ログ出力が必要な場合は Action<Exception> を受け取るオーバーロードを利用できます。
非致命的エラーを致命的エラーに昇格させたい場合
最初の OnErrorResume が発生した時点でシーケンスを終了させたい場合は OnErrorResumeAsFailure を使用します。非致命的エラーを失敗完了として扱いたい場面に適しています。