2

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

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)

4

1 回答 1

2

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

在 .NET Framework 1.0 和 1.1 版中,发生在主应用程序线程以外的线程中的未处理异常会被运行时捕获,因此不会导致应用程序终止。因此,可能会在应用程序终止的情况下引发 UnhandledException 事件。在 .NET Framework 2.0 版中,删除了对子线程中未处理异常的支持,因为这种静默故障的累积影响包括性能下降、数据损坏和锁定,所有这些都难以调试。有关更多信息,包括运行时不终止的情况列表,请参阅托管线程中的异常。

请参阅AppDomain.UnhandledException Event的文档。

对于那些好奇的人,这里是堆栈跟踪(适用于 .NET 3.5 和 Reactive Extensions 版本 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)
于 2012-12-28T19:35:35.913 回答