2012-11-15 84 views
3

我想看看是否有可能處理除了全局級別處理(Application.UnhandledException)以外的viewmodel級別的異常。目前,如果其中一個視圖模型拋出一個未捕獲的錯誤,應用程序將很難崩潰。我想知道如何在模塊級別捕獲它,發佈一個事件,並將該模塊從它佔用的區域中刪除,而不是取下整個應用程序。棱鏡模塊級別異常處理

有沒有人執行過這樣的事情?
這種架構應該避免嗎?

回答

2

我在自己的工作中遇到了同樣的問題。覆蓋所有的以下似乎爲我們工作:

DispatcherUnhandledException += OnDispatcherUnhandledException; 

TaskScheduler.UnobservedTaskException +=TaskScheduler_UnobservedTaskException; \\exceptions in tasks 

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

此外,對於模塊&視圖模型級的異常,我們try/catch語句,然後通過EventAggregator發佈事件。在我們的shell中,我們訂閱這個事件來顯示/記錄錯誤。由於shell最可能容納所有區域,因此您應該能夠從視圖中移除/隱藏這些模塊。然而,我會說明模塊不能被卸載。這可能不是一個最佳的解決方案,我們仍在探索更好的方法來做到這一點。

殼牌:

EventAggregator.GetEvent<RaisedExceptionEvent>().Subscribe(RaisedException); 

視圖模型:

try 
{ 
} 
catch (Exception ex) 
{ 
      EventAggregator.GetEvent<RaisedExceptionEvent>().Publish(new ExceptionManager(ex, 
                          ExceptionMessageType. 
                           Default, true)); 
} 
+0

我想大約在同一行除了一些沒有如何做一個try/catch(但我不認爲這是可能的到處走走)。此外,我不是故意卸載一個模塊...我只是想讓regionmanager從它所在的區域中刪除它。我也發現這個鏈接有用http://stackoverflow.com/questions/4625825/catching-exceptions- in-the-wpf-at-the-framework-level – Toad

+0

是的,這個鏈接是做同樣的事情,除了它只覆蓋主UI線程並且通常是不可恢復的。通過使用pub/sub,你將有try/catch,但你可以恢復,如果你有一些未處理的東西,你至少可以在關閉應用程序之前記錄/顯示它。在這一點上,我們還沒有找到一種方法來避免嘗試/捕獲。如果你找到一個很好的解決方案,請分享。 – marcellscarlett