我正在使用最新的Reactive Extensions并遇到了设计问题:
如果我从传递给订阅的委托中抛出异常,会发生什么?
通过源步进,我发现:
- 受试者将忽略异常。
- 从 Producer 派生的运算符(例如
Where
)在异常通过它们时处理订阅。
因此,当然,我一直发现,在任何通过标准 RX 运算符传递可观察对象的地方,任何异常都会导致我的事件由于处理而停在那里。至少,除非我重新订阅。
这让我质疑我的设计。从我的代表那里抛出异常是一个坏主意吗?显然 RX 团队是这么认为的。(虽然我会质疑默默地处理“坏”订阅是否是正确的方法。)
不过,看看我的设计,我不明白为什么会出现问题。我有一些受保护的操作正在进行,我开始触发一些 OnNext 来通知侦听器(我们已经从旧的 skool .NET 事件完全切换到 Observables),如果那里出现任何问题,它将抛出堆栈直到它遇到处理程序. 在我的例子中,处理程序回滚它正在处理的事务,这也会通知侦听器回滚。这一切都是异常安全的,工作正常。至少,如果 Dispose 在 Where 运算符的 Producer 基础中进行,它可以正常工作。
更进一步......主题和同行不这样做是否不一致?对于我们自己在此处编写的 ISubject 和 observable 运算符,我们是否应该执行相同的异常处理行为?
我期待着任何见解!