Skip to content

OnErrorResumeAsFailure

1. 概要

OnErrorResumeAsFailure は、最初の OnErrorResume 通知(非致命的エラー)を OnCompleted(Result.Failure) に変換し、シーケンスを終了させるオペレーターです。OnErrorResume を失敗完了として扱い、以降の値を流したくない場合に使用します。

2. シグネチャ

非致命的エラーを致命的エラーに変換する

csharp
public static Observable<T> OnErrorResumeAsFailure<T>(
    this Observable<T> source)

ソースシーケンスで最初の OnErrorResume が発行されると、その例外を使って OnCompleted(Result.Failure(exception)) を発行し、シーケンスを終了します。2 つ目以降の OnErrorResumeOnNext は発行されません。

3. マーブルダイアグラム

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

ソースシーケンスから OnErrorResume が発行されると、その時点で下流には OnCompleted(Result.Failure) が通知され、シーケンスが終了します。OnErrorResume より前に発行された OnNext 要素は正常に下流へ伝播されます。

4. サンプルコード

最初の非致命的エラーでシーケンスを終了する

csharp
using R3;

var source = Observable.Create<int>(observer =>
{
    observer.OnNext(1);
    observer.OnNext(2);
    // 非致命的エラーを発行
    observer.OnErrorResume(new InvalidOperationException("データ不整合"));
    // 以降は OnErrorResumeAsFailure により到達しない
    observer.OnNext(3);
    observer.OnCompleted();
    return Disposable.Empty;
});

source
    .OnErrorResumeAsFailure()
    .Subscribe(
        value => Console.WriteLine($"値: {value}"),
        result =>
        {
            if (result.IsFailure)
            {
                Console.WriteLine($"致命的エラーで終了: {result.Exception.Message}");
            }
            else
            {
                Console.WriteLine("正常完了");
            }
        }
    );

// 出力:
// 値: 1
// 値: 2
// 致命的エラーで終了: データ不整合

Catch と組み合わせて非致命的エラーからリカバリする

csharp
using R3;

var fallback = Observable.Return(0);

var source = Observable.Create<int>(observer =>
{
    observer.OnNext(10);
    observer.OnErrorResume(new TimeoutException("タイムアウト"));
    observer.OnNext(20); // 到達しない
    observer.OnCompleted();
    return Disposable.Empty;
});

// 非致命的エラーを致命的エラーに昇格させた後、Catch でフォールバック
source
    .OnErrorResumeAsFailure()
    .Catch(fallback)
    .Subscribe(
        value => Console.WriteLine($"値: {value}"),
        result => Console.WriteLine($"完了: {result}")
    );

// 出力:
// 値: 10
// 値: 0
// 完了: Success

5. 補足

IgnoreOnErrorResume との比較

OnErrorResumeAsFailureIgnoreOnErrorResume はどちらも OnErrorResume(非致命的エラー)を対象としますが、正反対のアプローチを取ります。

特性OnErrorResumeAsFailureIgnoreOnErrorResume
非致命的エラーへの対応致命的エラーに昇格して終了エラーを無視して継続
エラーへの姿勢最初のエラーで停止エラーを許容して継続
適した場面データの整合性を優先する場合一時的な障害を許容できる場合

最初の OnErrorResume で処理を止めたいパイプラインでは OnErrorResumeAsFailure を使用し、一時的なエラーを許容するパイプラインでは IgnoreOnErrorResume を使用します。