观察者无法捕捉动态扩展方法中引发的异常



我创建了另一个类的扩展。我调用了扩展方法,该方法抛出异常。不幸的是,我的观察者没有发现这个异常。

有人知道为什么吗?

public static class MyExtensions {
public static async void myextfunc(this SomeClass some, dynamic data) {
throw new Exception("Atrápame si puedes.");
} // fin myextfunc()
} // fin class

SomeClass some = new SomeClass();
IObserver<dynamic> obsv = Observer.Create<dynamic>(async (d) => {
some.myextfunc((object)d); // NO PUEDO atrapar la exceptión
}, (exception0) => {
Console.WriteLine(e1.Message);
});
try { obsv.OnNext(123); } catch { /* no funciona */ }

实际上,这种行为并不依赖于使用扩展方法。当方法需要同步委托时,它取决于使用async函数(Observer。Create只将Action<T>作为onNext的输入(。

首先,您永远不应该使用async void,因为调用者无法正确地等待它(这意味着try/catch不会进行异常处理,例如,这里有更多详细信息(。但是,即使我们试图更改您的代码(将Task而不是void return添加到您的扩展方法中,并在Observer的onNext中等待它(,它也不会起作用。

这正是因为Observer。Create期望Action<T>,而不是Func<任务>。

很难理解您到底想要实现什么,所以我使用了您的代码,假设您想要捕获异步调用中抛出的异常。这就是我所拥有的:

async static Task Main(string[] args)
{
SomeClass some = new SomeClass();
var subscription = Observable.Interval(TimeSpan.FromSeconds(1))
.SelectMany(number => Observable.FromAsync(async () => await some.myextfunc(number)))
.Subscribe(_ => Console.WriteLine("onNext"),
ex => Console.WriteLine(ex.Message));
await Task.Delay(TimeSpan.FromSeconds(10));
}

您可以在GitHub上的讨论中找到更多信息,也可以在async/await with RX上搜索SO问题。

最新更新