IgnoreOnErrorResume
1. 概要
IgnoreOnErrorResume は、ソース Observable の OnErrorResume 通知(非致命的エラー)を抑制し、シーケンスの処理を継続するオペレーターです。非致命的エラーは無視され、後続の要素はそのまま発行されます。
2. シグネチャ
エラーを完全に無視するオーバーロード
csharp
public static Observable<T> IgnoreOnErrorResume<T>(
this Observable<T> source)OnErrorResume 通知を完全に破棄します。エラーの内容は一切取得できません。一時的なエラーを単純に無視したい場合に使用します。
エラー発生時にアクションを実行するオーバーロード
csharp
public static Observable<T> IgnoreOnErrorResume<T>(
this Observable<T> source,
Action<Exception> doOnErrorResume)OnErrorResume 通知を抑制しつつ、破棄する前に doOnErrorResume コールバックを実行します。ログ出力やメトリクス記録など、エラーの発生を副作用として記録したい場合に使用します。
オーバーロード の使い分け
| オーバーロード | 使用場面 |
|---|---|
IgnoreOnErrorResume(source) | 一時的なエラーを完全に無視してよい場合 |
IgnoreOnErrorResume(source, doOnErrorResume) | エラーは無視するが、ログ出力や監視のために記録したい場合 |
3. マーブルダイアグラム
ソースシーケンスから OnErrorResume が発行されると、その通知は下流に伝播されず破棄されます。通常の OnNext 要素と OnCompleted はそのまま通過します。
4. サンプルコード
非致命的エラーを完全に無視する
csharp
using R3;
var source = Observable.Create<int>(observer =>
{
observer.OnNext(1);
observer.OnNext(2);
// 非致命的エラー(シーケンスは継続する)
observer.OnErrorResume(new InvalidOperationException("一時的な障害"));
observer.OnNext(3);
observer.OnCompleted();
return Disposable.Empty;
});
source
.IgnoreOnErrorResume()
.Subscribe(
value => Console.WriteLine($"値: {value}"),
result => Console.WriteLine($"完了: {result}")
);
// 出力:
// 値: 1
// 値: 2
// 値: 3
// 完了: Successエラーをログに記録しつつ無視する
csharp
using R3;
var source = Observable.Create<string>(observer =>
{
observer.OnNext("データA");
observer.OnErrorResume(new TimeoutException("API タイムアウト"));
observer.OnNext("データB");
observer.OnErrorResume(new IOException("ネットワーク一時切断"));
observer.OnNext("データC");
observer.OnCompleted();
return Disposable.Empty;
});
source
.IgnoreOnErrorResume(ex =>
{
Console.WriteLine($"[WARN] 非致命的エラーを無視: {ex.GetType().Name}: {ex.Message}");
})
.Subscribe(
value => Console.WriteLine($"値: {value}"),
result => Console.WriteLine($"完了: {result}")
);
// 出力:
// 値: データA
// [WARN] 非致命的エラーを無視: TimeoutException: API タイムアウト
// 値: データB
// [WARN] 非致命的エラーを無視: IOException: ネットワーク一時切断
// 値: データC
// 完了: Success5. 補足
関連オペレーターとの比較
IgnoreOnErrorResume は非致命的エラーを「抑制」するアプローチです。他のエラーハンドリングオペレーターと比較すると、以下のような位置付けになります。
| 特性 | IgnoreOnErrorResume | OnErrorResumeAsFailure | Catch |
|---|---|---|---|
| 対象エラー | 非致命的エラー (OnErrorResume) | 非致命的エラー (OnErrorResume) | 致命的エラー (OnCompleted(Result.Failure)) |
| 動作 | エラーを無視して継続 | 致命的エラーに昇格して終了 | 代替 Observable に切り替え |
| エラーへの姿勢 | 寛容(エラーを許容する) | 厳格(エラーを許容しない) | 回復(エラーから復帰する) |
OnErrorResumeAsFailure は IgnoreOnErrorResume とは正反対のアプローチです。IgnoreOnErrorResume が非致命的エラーを無視するのに対し、OnErrorResumeAsFailure は非致命的エラーを致命的エラーに昇格させてシーケンスを即座に終了します。
また、Catch と組み合わせることで、「非致命的エラーはログに記録して無視し、致命的エラーにはフォールバック処理を行う」といった多層的なエラーハンドリングを実現できます。