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

问题描述 投票:0回答:1

我创建了另一个类的扩展。我调用了扩展方法,该方法抛出异常。不幸的是,我的观察者无法捕获到该异常。

任何人都知道为什么吗?

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 */ }
c#
1个回答
0
投票

实际上,此行为不依赖于使用扩展方法。当一个方法需要同步委托(Observer.Create仅将Action 作为onNext的输入)时,它取决于使用async函数。

首先,您永远不要使用async void,因为调用者无法正确地<< [await(例如,try / catch不会进行任何异常处理) ,more details here)。但是,即使我们尝试更改您的代码(将Task而不是void添加到您的扩展方法中并在Observer的onNext中等待它)也将无法正常工作。

这完全是因为

Observer.Create

期望Action ,而不是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)); }

您可以从this discussion on GitHub中找到更多信息,并通过RX搜索异步/等待中的SO问题。 
© www.soinside.com 2019 - 2024. All rights reserved.