2012-12-28 36 views
2

目前我的應用程序捕獲的未處理異常如下:異常重複無限使用的Rx

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
的標準行爲如何避免或改變這種行爲?


我的目標是隻有一次運行的代碼。獨立的如果發生異常,其中一個要求是它被定時器觸發 Something else ..如果有異常,應該用DispatcherUnhandledException或UnobservedTaskException或類似的方法來處理(這樣可以防止我寫一個try catch對於每次申請和關閉應用)

+1

什麼異常說..我懷疑,如果有一個定時器控件即Observable.Timer(TimeSpan.Zero).Do代碼將在一定數量的間隔中觸發。粘貼Exception請將基本數學任何東西除以0 = 0,但在代碼中將產生DivideByZero異常 – MethodMan

+0

重點是:.Take 1)不被尊重,我更新了我的問題。無論拋出什麼異常 –

+0

Observable.Timer(DateTimeOffset.MinValue,TimeSpan.FromSeconds(1));這會爲你工作嗎? – MethodMan

回答

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 &無擴展版本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) 
+0

感謝您的幫助。我很困惑「DispatcherUnhandledException」和「CurrentDomain.UnhandledException」 –