RX.Net:使用重试但记录任何异常

2024-06-10

我是 RX 的新手,一直在研究错误处理和 Retry 的使用;我有以下内容(是的,我知道这不是“真正的”单元测试,但它给了我摆弄的地方!)并且想知道如何保留重试但能够记录任何异常?

    [Test]
    public void Test()
    {
        var scheduler = new TestScheduler();

        var source = scheduler.CreateHotObservable(
            new Recorded<Notification<long>>(10000000, Notification.CreateOnNext(0L)),
            new Recorded<Notification<long>>(20000000, Notification.CreateOnNext(1L)),
            new Recorded<Notification<long>>(30000000, Notification.CreateOnNext(2L)),
            new Recorded<Notification<long>>(30000001, Notification.CreateOnError<long>(new Exception("Fail"))),
            new Recorded<Notification<long>>(40000000, Notification.CreateOnNext(3L)),
            new Recorded<Notification<long>>(40000000, Notification.CreateOnCompleted<long>())
        );

        source.Retry().Subscribe(
            l => Console.WriteLine($"OnNext {l}"), 
            exception => Console.WriteLine(exception.ToString()), // Would be logging this in production
            () => Console.WriteLine("OnCompleted"));

       scheduler.Start(
            () => source,
            0,
            TimeSpan.FromSeconds(1).Ticks,
            TimeSpan.FromSeconds(5).Ticks);
    }

这导致...

OnNext 0
OnNext 1
OnNext 2
OnNext 3
OnCompleted

...这正是我想要发生的事情,除了我想记录 2 和 3 之间发生的异常之外。

有没有办法让订阅者看到 OnError 中的异常(并记录它),然后重新订阅,以便看到 3?


你可以用这个来实现:

source
    .Do(_ => { }, exception => Console.WriteLine(exception.ToString()), () => {})
    .Retry()
    .Subscribe(
        l => Console.WriteLine($"OnNext {l}"),
        //      exception => Console.WriteLine(exception.ToString()), // Would be logging this in production
        () => Console.WriteLine("OnCompleted")
    );

只是为了澄清这里发生了什么:OnError是一个终止信号。如果错误到达订阅,则会终止流的其余部分。.Retry终止订阅,吞掉OnError,然后重新订阅,将两个订阅融合在一起。例如看看这个:

source
    .StartWith(-1)
    .Retry()
    .Subscribe(
        l => Console.WriteLine($"OnNext {l}"),
        () => Console.WriteLine("OnCompleted")
    );

你的输出将是

OnNext -1
OnNext 0
OnNext 1
OnNext 2
OnNext -1
OnNext 3
OnCompleted

The OnNext -1显示两次,因为每当您订阅时它就会显示(Retry之后做OnError.

坦率地说,您的可观察测试是一个糟糕的测试。它打破了“接收合同”,即通知遵循以下模式:

OnNext* (OnCompleted | OnError)? 

也就是说,0个或多个OnNext通知,然后是可选的OnError或可选的OnCompleted。任何类型的通知都不应遵循OnError or an OnCompleted.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RX.Net:使用重试但记录任何异常 的相关文章

随机推荐

  • 从带有参数的方法名称创建选择器

    我有一个代码示例 它得到SEL从当前对象 SEL callback selector mymethod parameter2 我有一个像这样的方法 void mymethod id v1 parameter2 NSString v2 现在我
  • 如何从“内容”子文件夹中添加图像 - pelican

    我有一个结构 content applications 2017 08 30 article md forecast1 png 我希望 img 文件与md文件 以便可以将它们放入 ARTICLE SAVE AS posts date Y d
  • 操作栏中菜单项的自定义行

    我正在尝试在操作栏中的菜单中创建带有自定义行的列表视图 像这样的东西 我在网上搜索了很多 但找不到任何有用的东西 我怎样才能实现这个目标 我知道您可以将自定义视图与菜单中的项目绑定 但如何绑定 我想将列表视图与该项目绑定
  • 什么是 Realm 以及为什么我们需要它(ecma262)?

    Realm 是根据什么ecma262为什么我们需要它 我发现的关于为什么问题的全部内容是 在评估之前 所有 ECMAScript 代码必须与一个领域关联 嗯 没有多大帮助 为什么所有 ECMAScript 代码都必须关联realm http
  • 友谊和派生类

    假设我有以下类层次结构 class Base protected virtual void foo 0 friend class Other class Derived public Base protected void foo Some
  • Firebase 云函数被多次调用

    您好 当我没有检查 previous exists 时 我的 firebase 云函数会被多次调用 我收到多个推送通知 if event data exists return if event data previous exists re
  • 如何在 GitHub Action 中推送到受保护的主分支?

    这是我的 github 操作工作流程 name Release on push branches main jobs release name Release runs on ubuntu latest steps name Checkou
  • 为什么我们在 log4j.xml 中需要 root 和 logger

    如果问题太微不足道 请原谅 我对 log4j 完全陌生 我看到有两个tags和tags 分别指的是各种appender 假设我想将代码库中的信息记录在文件中 将其发送到我的电子邮件并将其打印到控制台 我希望将级别设置为信息 拥有一个引用三个
  • NSNumberFormatter 货币没有符号?

    我正在使用 NSNumberFormatter 从字符串中获取货币值 效果很好 我使用这段代码来执行此操作 NSNumberFormatter nf NSNumberFormatter alloc init nf setNumberStyl
  • Mercurial on Phabricator:“远程:中止:流意外结束”

    我在尝试推送到远程服务器时遇到此问题 它是 Phabricator 上的 Mercurial 存储库 这是我的输出 hg commit m udpate README hg push pushing to ssh company serve
  • 从命令行运行 R 脚本

    我有一个文件 名为a r 它有一个chmod of 755 sayHello lt function print hello sayHello 我如何通过命令行运行它 Answer recommended by R Language col
  • 如何在 Android 中将 CheckBox 与其描述顶部对齐

    我想对齐CheckBox 符号 位于其描述的顶部 What I have now What I want to have 当前的 XML
  • 如何通过不记名令牌使用 Azure AD 授权的服务

    我正在尝试使用一项服务 该服务通过我的机器人内的不记名令牌 Azure AD 令牌 授权请求 我该如何处理这样的情况 基本上 策略是拥有一个支持您的身份验证的网页并向用户发送链接 当他们点击它时 他们将完成身份验证流程 当您获得访问令牌时
  • 如何才能完全替代 3.10 中已弃用的 distutils?

    根据PEP 632 https www python org dev peps pep 0632 distutils将被正式标记为已弃用 并在 Python 3 12 中将其删除 我的产品很快就会支持 Python 3 10 我不想忍受弃用
  • Xcode:增加内部版本号

    我们使用一个脚本来创建时间戳并替换应用程序版本号 bin bash echo Update Build Number to Timestamp echo fail on error set e agvtool new version all
  • Android:同时使用 onTouch、onClick 和 onLongClick

    在我的应用程序中 我必须将视图移动到布局上的任何位置 所以我用了onTouchListener On onClick and onLongClick 我还得执行一些其他任务 我能够转移观点 但听众之间却存在着矛盾 当我移动视图时 有时 要么
  • jquery fade 元素不显示样式为“可见性:隐藏”的元素

    我有一堆缩略图 我正在加载它们的样式visibility hidden 以便它们都保持正确的布局 页面完全加载后 我有一个 jquery 函数可以使它们淡入 当它们的样式设置为display none 但显然当时的布局搞砸了 有什么建议么
  • Angular Material Design - 根据屏幕尺寸更改弹性值

    我是 AngularJS 的新手 所以请耐心等待 我在用着角度材料设计 https material angularjs org latest 我很难找到一种有效地实现响应式网格的方法 请参阅下面代码中我的评论 div div class
  • 用 C++/Qt 编写的程序中的 RTF / doc / docx 文本提取

    我正在写一些程序Qt https en wikipedia org wiki Qt 28software 29 C 我需要从中读取文本微软Word https en wikipedia org wiki Microsoft Word RTF
  • RX.Net:使用重试但记录任何异常

    我是 RX 的新手 一直在研究错误处理和 Retry 的使用 我有以下内容 是的 我知道这不是 真正的 单元测试 但它给了我摆弄的地方 并且想知道如何保留重试但能够记录任何异常 Test public void Test var sched