runceel / ReactiveProperty

ReactiveProperty provides MVVM and asynchronous support features under Reactive Extensions. Target frameworks are .NET 6+, .NET Framework 4.7.2 and .NET Standard 2.0.
MIT License
903 stars 101 forks source link

Subscribe 内で例外発生後、Subscribeが実行されない。 #246

Closed pianyi closed 3 years ago

pianyi commented 3 years ago

大変便利に使わせて頂いております。 WPF .netCore3.1にてReactiveProperty 7.5.1 を利用させて頂いております。

表題の件ですが、下記単体テストコードと同等の処理を行っております。 1度Subscribe内で例外が発生すると、その後はSubscribeが一切動かなくなってしまいます。 なおコード内はReactivePropertySlim ですが、ReactiveProperty でも同様でした。

そこで質問なのですが、 1.例外が発生後も、Subscribeが実行されるようにするにはどのような対応をすれば良いでしょうか。 2.Subscribe 内の例外は必ずcatchする前提の場合、発生した例外を呼び出し元に帰す方法が思いついておりません。  何か方法があればご教授頂けないでしょうか。

よろしくお願いいたします。

[TestMethod]
public void ForceNotify()
{
    bool isError = false;
    var rp = new ReactivePropertySlim<int>(0);
    var collector = new List<int>();
    rp.Skip(1).Subscribe(e => {
        if (isError)
        {
            throw new Exception();
        }
        else
        {
            collector.Add(e);
        }
    });
    collector.Is();
    rp.ForceNotify();
    collector.Is(0);
    try
    {
        isError = true;
        rp.ForceNotify();
    }
    catch { // 想定内の例外 }
    collector.Is(0);
    isError = false;
    // Subscribe が実行されない
    rp.Value = 1;
    collector.Is(0, 1);
    // Subscribe が実行されない
    rp.ForceNotify();
    collector.Is(0, 1, 0);
}

作成アプリの概要: 画面をTCP/IPからも操作出来るツールを作っております。 画面操作のエラーはメッセージを表示、TCP/IP操作のエラーは応答させようと思っています。 その場合、画面更新で発生した例外をそのまま別々に受けれればと考えております。

runceel commented 3 years ago

Subscribe 内で例外が出たら終了します。ReactiveProperty というよりは Reactive Extensions 全般でそのように動きます。 Subscribe で例外が出るような処理をやる場合は Subscribe 内で例外処理をおこなってください。

pianyi commented 3 years ago

知識不足で見当違いの質問をしてしまい申し訳ありませんでした。 御回答頂きありがとうございました。