我创建了另一个类的扩展。我调用了扩展方法,该方法抛出异常。不幸的是,我的观察者无法捕获到该异常。
任何人都知道为什么吗?
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 */ }
实际上,此行为不依赖于使用扩展方法。当一个方法需要同步委托(Observer.Create仅将Action
首先,您永远不要使用async void,因为调用者无法正确地<< [await(例如,try / catch不会进行任何异常处理) ,more details here)。但是,即使我们尝试更改您的代码(将Task而不是void添加到您的扩展方法中并在Observer的onNext中等待它)也将无法正常工作。
这完全是因为Observer.Create
期望Actionasync 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));
}
您可以从this discussion on GitHub中找到更多信息,并通过RX搜索异步/等待中的SO问题。