5

私は行動の主題を持っています

var source = new BehaviorSubject<int>(0);

次に、そのソースを次のようなもので処理します

var withErrors = source
            .Select(v =>
            {
                if (v == 2)
                {
                    throw new Exception("Ouch ");
                }
                return v;
            })

エラーをスキップできるように withErrors に登録したいと思います。こんなキャッチでの試み。

public IObservabe<int> SkipError(IObservable<T> source){

    return source
       .Catch(e=>SkipErrors(source.Skip(1));
}

そしてそれをこう呼ぶ

var withoutErrors = SkipError(withErrors);

スキップは、行動主体の最後のエラーを繰り返さないようにする試みですが、残念ながらそのようには機能しません。スキップはエラーをスキップしませんが、有効なデータのみをスキップするため、動作サブジェクトの現在の状態からのエラーは通過し続けます。

エラーもスキップする Skip を書く賢い方法はありますか。これは不可能だと何かが私に言っていますが、うまくいけば私は間違っています

4

1 に答える 1

2

質問の前提が間違っているので、モナドbetterを使用してこれを行う方法を提示します。Exceptional<T>例えば

IObservable<int> source = ....;
IObservable<Exceptional<string>> withErrors =
    source.Select(i=>Exceptional.Execute(()=>{
        if(v==2){
            throw new Exception("Ouch");
        }
        return v.ToString();
    });


IObservable<Exception> errors = 
    withErrors.Where(v=>v.HasException).select(v=>v.Exception);

IObservable<string> values =
    withErrors.Where(v=>!v.HasException).select(v=>v.Value);

楽しみのためにできること

Exceptional<string> r = 
         from x in Exceptional.Execute(() => "xxx")
         from y in Exceptional.Execute(() => "zzz")
         select x + y;

これは、値「xxxzzz」を保持する例外を生成します。ステップのいずれかが例外をスローした場合、それは短絡し、例外のみを保持します。

別の SO 回答に基づく私の実装はhttps://gist.github.com/bradphelan/6154972です

于 2013-08-05T10:58:06.860 に答える