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 つ目以降の OnErrorResume や OnNext は発行されません。
3. マーブルダイアグラム
ソースシーケンスから 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
// 完了: Success5. 補足
IgnoreOnErrorResume との比較
OnErrorResumeAsFailure と IgnoreOnErrorResume はどちらも OnErrorResume(非致命的エラー)を対象としますが、正反対のアプローチを取ります。
| 特性 | OnErrorResumeAsFailure | IgnoreOnErrorResume |
|---|---|---|
| 非致命的エラーへの対応 | 致命的エラーに昇格して終了 | エラーを無視して継続 |
| エラーへの姿勢 | 最初のエラーで停止 | エラーを許容して継続 |
| 適した場面 | データの整合性を優先する場合 | 一時的な障害を許容できる場合 |
最初の OnErrorResume で処理を止めたいパイプラインでは OnErrorResumeAsFailure を使用し、一時的なエラーを許容するパイプラインでは IgnoreOnErrorResume を使用します。