You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:55:19