2012-11-15 78 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