Rx.NET中如何为Observable.Timeout自定义抛出异常?(双Observable场景)
替换Observable.Timeout的默认异常为自定义异常
要把Timeout抛出的默认TimeoutException替换成你的自定义FoobarException,有两种简洁的实现方式,直接上代码和说明:
方法1:使用Timeout的重载(推荐)
Timeout有一个重载允许我们指定超时时触发的备用Observable,直接在这里返回抛出自定义异常的Observable即可,逻辑更连贯:
var totalTimeout = Observable.Throw<FoobarException>(new FoobarException("总流程超时")).DelaySubscription(TimeSpan.FromSeconds(10)); // 修改当前操作超时的Observable,替换默认异常 var processStepTimeout = Observable.FromEventPattern(btn_nextStep, nameof(btn_nextStep.Click)) .Timeout( TimeSpan.FromSeconds(3), Observable.Throw<EventPattern<EventArgs>>(new FoobarException("当前操作超时")) // 自定义超时提示 ); totalTimeout.Amb(processStepTimeout) .Subscribe( _ => {}, // 正常点击下一步的处理逻辑 ex => MessageBox.Show(ex.Message) // 此处将收到自定义的FoobarException );
说明:这个重载的优势是不需要额外的异常捕获步骤,直接在超时逻辑里定义自定义异常。需要注意泛型类型匹配——原Observable的输出是EventPattern<EventArgs>,所以抛出异常的Observable也要对应这个类型,避免编译错误。
方法2:用Catch操作符捕获替换异常
如果更习惯用异常捕获的思路,也可以通过Catch拦截默认的TimeoutException,再抛出自定义异常:
var totalTimeout = Observable.Throw<FoobarException>(new FoobarException("总流程超时")).DelaySubscription(TimeSpan.FromSeconds(10)); var processStepTimeout = Observable.FromEventPattern(btn_nextStep, nameof(btn_nextStep.Click)) .Timeout(TimeSpan.FromSeconds(3)) .Catch((TimeoutException ex) => Observable.Throw<EventPattern<EventArgs>>(new FoobarException("当前操作超时"))); totalTimeout.Amb(processStepTimeout) .Subscribe( _ => {}, ex => MessageBox.Show(ex.Message) );
说明:Catch会监听原Observable抛出的TimeoutException,一旦捕获到就返回一个抛出自定义异常的Observable,以此完成异常替换。
注意事项
- 确保你的
FoobarException已正确定义,需继承自Exception基类; - 两种方法都要保证泛型类型一致,否则会出现编译不通过的问题。
内容的提问来源于stack exchange,提问作者Uli
相关产品推荐
相关产品推荐

