Skip to content

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. マーブルダイアグラム

IgnoreOnErrorResume のマーブルダイアグラム

ソースシーケンスから 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
// 完了: Success

5. 補足

関連オペレーターとの比較

IgnoreOnErrorResume は非致命的エラーを「抑制」するアプローチです。他のエラーハンドリングオペレーターと比較すると、以下のような位置付けになります。

特性IgnoreOnErrorResumeOnErrorResumeAsFailureCatch
対象エラー非致命的エラー (OnErrorResume)非致命的エラー (OnErrorResume)致命的エラー (OnCompleted(Result.Failure))
動作エラーを無視して継続致命的エラーに昇格して終了代替 Observable に切り替え
エラーへの姿勢寛容(エラーを許容する)厳格(エラーを許容しない)回復(エラーから復帰する)

OnErrorResumeAsFailureIgnoreOnErrorResume とは正反対のアプローチです。IgnoreOnErrorResume が非致命的エラーを無視するのに対し、OnErrorResumeAsFailure は非致命的エラーを致命的エラーに昇格させてシーケンスを即座に終了します。

また、Catch と組み合わせることで、「非致命的エラーはログに記録して無視し、致命的エラーにはフォールバック処理を行う」といった多層的なエラーハンドリングを実現できます。