3
我想看看是否有可能处理除了全局级别处理(Application.UnhandledException)以外的viewmodel级别的异常。目前,如果其中一个视图模型抛出一个未捕获的错误,应用程序将很难崩溃。我想知道如何在模块级别捕获它,发布一个事件,并将该模块从它占用的区域中删除,而不是取下整个应用程序。棱镜模块级别异常处理
有没有人执行过这样的事情?
这种架构应该避免吗?
我想看看是否有可能处理除了全局级别处理(Application.UnhandledException)以外的viewmodel级别的异常。目前,如果其中一个视图模型抛出一个未捕获的错误,应用程序将很难崩溃。我想知道如何在模块级别捕获它,发布一个事件,并将该模块从它占用的区域中删除,而不是取下整个应用程序。棱镜模块级别异常处理
有没有人执行过这样的事情?
这种架构应该避免吗?
我在自己的工作中遇到了同样的问题。覆盖所有的以下似乎为我们工作:
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));
}
我想大约在同一行除了一些没有如何做一个try/catch(但我不认为这是可能的到处走走)。此外,我不是故意卸载一个模块...我只是想让regionmanager从它所在的区域中删除它。我也发现这个链接有用http://stackoverflow.com/questions/4625825/catching-exceptions- in-the-wpf-at-the-framework-level – Toad
是的,这个链接是做同样的事情,除了它只覆盖主UI线程并且通常是不可恢复的。通过使用pub/sub,你将有try/catch,但你可以恢复,如果你有一些未处理的东西,你至少可以在关闭应用程序之前记录/显示它。在这一点上,我们还没有找到一种方法来避免尝试/捕获。如果你找到一个很好的解决方案,请分享。 – marcellscarlett