【发布时间】:2020-03-31 16:32:28
【问题描述】:
我有一个 IObservable 设置,我试图触发它从“冷”过渡到“热”。然而,纯粹靠运气,我发现在 IObservable 的某个地方,抛出了一个未处理的异常。
我立刻吓坏了,因为 Reactive Extensions 没有让我知道这个未处理的异常。 我猜这个流刚刚终止,而不是。现在我担心 Rx Extensions 会吞噬其他异常。
这是我目前用来触发 IObservable 为“热”的代码。我希望 IObservable 内部发生的任何未处理的异常都会冒泡并被抛出这里。但他们不是。
var observable = Observable.Create<>(async a =>
{
...
a.OnNext();
...
a.OnCompleted();
});
observable = observable.Do(onNext: ...,
onCompleted: async () =>
{
// This throws the unhandled exception
await MethodThatThrowsExceptionAsync();
});
// I would expect any exceptions inside the IObservable to bubble up and be rethrown here.
await observable.LastOrDefaultAsync();
我做错了吗?这是预期的行为吗?如果是这样,这似乎极易出错。
【问题讨论】:
-
那是
OnError。 -
Rx 没有吞下异常;您传递给
onCompleted的async voidlambda 是导致未处理异常的原因。您不能将async与Do混合使用;您将不得不重组您的查询。 -
@PauloMorgado 如果我添加一个 onError 处理程序,它永远不会被命中。
-
@StephenCleary 有没有办法将异步传递给 oncompleted?我也尝试了订阅,结果相同。
-
@StephenCleary - 不走运。如果我用 MethodThatThrowsExceptionAsync().Wait() 之类的东西替换异步,那么管道仍然只是默默地失败并过早结束
标签: c# system.reactive