我正在做一个广泛使用Rx的大型项目。 在一个特定实例中,我注意到其中一个订阅抛出了异常。 那时我假设订阅刚刚完成(出现错误),因为我没有任何 Retry() 调用。 但是,我看到的是订阅反复重试。
我试图在一个小例子中重现类似的案例,如下所示。 我放了一个断点
Console.WriteLine("!");
并预计在订阅失败后会受到打击。 但它从未达到。GetImportantValues()。订阅只是一遍又一遍地调用。
我不明白为什么。 我本来希望抛出的异常会杀死订阅尝试。
我想修改下面的示例,以便在抛出异常时重试 3 次,然后完全停止。
using System;
using System.Reactive.Linq;
namespace RxTest
{
class Program
{
static void Main(string[] args)
{
var ob1 = GetImportantValues().Subscribe(Console.WriteLine);
Console.WriteLine("!");
Console.ReadLine();
}
private static IObservable<int> GetImportantValues()
{
var obs = GetThem();
return obs;
}
private static IObservable<int> GetThem()
{
//Do some work. Would return a valid observable if everything is ok
return Observable.Throw<int>(new Exception("test"));
}
}
}
它不是一遍又一遍地调用。您可能只是在 Visual Studio 中启用了"第一次机会时中断"异常,每次尝试继续时,它只是在相同的异常上中断。如果您实际继续该过程,应用程序将崩溃。
Observable.Throw
打电话给OnError
.您尚未在对 Subscribe
的调用中提供 OnError
处理程序,因此使用默认的OnError
处理程序。默认行为只是抛出错误并关闭进程。
要重试,只需在调用 Subscribe
之前应用 Retry(3)
即可。要在第三次尝试后吞下错误,请提供一个OnError
处理程序来Subscribe
,尽管我不一定推荐后者。仔细考虑应用程序是否真的可以从这种情况中恢复。