使用 Rx 无限重复异常

Posted

技术标签:

【中文标题】使用 Rx 无限重复异常【英文标题】:Exception repeating infinitely, using Rx 【发布时间】:2012-12-13 21:13:14 【问题描述】:

目前我的应用程序捕获未处理的异常如下:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;

虽然,当异常发生时(例如):

        TimeSpan toExecute = AnyMethod();
        Observable.Timer(toExecute).Take(1).Subscribe((r) =>
        
            Trace.WriteLine("Subscribe");
            throw new Exception(); // simulation..
        );

异常不断重复自身(在调试中)。 尽管在发布模式或 Visual Studio 之外,应用程序已完成(AppDomain.CurrentDomain.UnhandledException 的标准行为 如何避免或改变这种行为?


我的目标是只运行一次代码。是否发生异常独立。要求之一是它由计时器触发。 别的东西..如果有异常,它应该被 DispatcherUnhandledException 或 UnobservedTaskException 或类似的处理(这使我无法为每个订阅和应用程序的关闭编写一个 try catch)

【问题讨论】:

异常说明了什么。我怀疑如果有一个 Timer 控件,该 Observable.Timer(TimeSpan.Zero).Do 代码将在一定数量的间隔内触发。请粘贴异常基本数学除以 0 = 0 但在代码中将产生 DivideByZero 异常 重点是:.Take(1) 不被尊重,我更新了我的问题.. 无论抛出什么异常 Observable.Timer(DateTimeOffset.MinValue, TimeSpan.FromSeconds(1));这对你有用吗? 我真的很困惑你要做什么......你能不能以不同的方式使用 Observable.Timer 而不是作为实验室 如果我没记错的话它会继续抛出异常,因为你的 => Trace.WriteLine("Subscribe");抛出新异常(); // 模拟.. );也许我对您的预期结果感到困惑..您可以尝试重新提出您的问题 【参考方案1】:

您的代码会触发 AppDomain.CurrentDomain.UnhandledException,它会终止 .NET 2.0 及更高版本的应用程序执行。如果您在 Visual Studio 中调试该代码,您会反复收到 Unhandled Exception 通知。

在 .NET Framework 1.0 和 1.1 版中,未处理的异常 发生在主应用程序线程以外的线程中的是 被运行时捕获,因此不会导致应用程序 终止。因此,UnhandledException 事件可能是 在应用程序终止的情况下引发。在 .NET 框架中 2.0 版,这是子线程中未处理异常的支持 被删除,因为这种无声失败的累积效应 包括性能下降、数据损坏和锁定,所有 这很难调试。如需更多信息,包括列表 运行时不终止的情况,请参阅 Exceptions in 托管线程。

请参阅AppDomain.UnhandledException Event 的文档。

对于那些好奇的人,这里是堆栈跟踪(适用于 .NET 3.5 和响应式扩展版本 1.0.10621.0):

System.Exception: Exception of type 'System.Exception' was thrown.

   at yournamespace.MainWindow.<Button_Click>b__0(Int64 r) in path\MainWindow.xaml.cs:line XX
   at System.Reactive.AnonymousObserver`1.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.Linq.Observable.<>c__DisplayClass2ff`1.<>c__DisplayClass301.<Take>b__2fe(TSource x)
   at System.Reactive.AnonymousObserver`1.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.Linq.Observable.<>c__DisplayClass35b.<>c__DisplayClass35d.<Timer>b__35a()
   at System.Reactive.Concurrency.Scheduler.Invoke(IScheduler scheduler, Action action)
   at System.Reactive.Concurrency.ThreadPoolScheduler.<>c__DisplayClass5`1.<Schedule>b__3(Object _)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading._TimerCallback.PerformTimerCallback(Object state)

【讨论】:

感谢您的帮助。我对“DispatcherUnhandledException”和“CurrentDomain.UnhandledException”感到困惑

以上是关于使用 Rx 无限重复异常的主要内容,如果未能解决你的问题,请参考以下文章

使用重复的结束页面的无限 UIScrollView

使用 setInterval() 的无限异步循环 [重复]

Scala,无限重复有限列表

使用css关键帧创建无限循环[重复]

使用无限滚动时在我的表格视图中重复数据

在 vuejs 中使用 v-for 时无限重复