C# Prism模块级异常处理

C# Prism模块级异常处理,c#,exception,mvvm,exception-handling,prism,C#,Exception,Mvvm,Exception Handling,Prism,我试图看看除了全局级别的处理(Application.UnhandledException)之外,是否还可以在viewmodel级别处理异常。当前,如果其中一个viewmodels抛出未捕获的错误,应用程序将硬崩溃。我想了解一些如何在模块级别捕获它,发布一个事件,并将此模块从它所占用的区域中移除,而不是关闭整个应用程序 有人实现过这样的东西吗 应该避免这种类型的架构吗?我在自己的工作中也遇到了同样的问题。涵盖以下所有方面似乎对我们有效: DispatcherUnhandledException

我试图看看除了全局级别的处理(Application.UnhandledException)之外,是否还可以在viewmodel级别处理异常。当前,如果其中一个viewmodels抛出未捕获的错误,应用程序将硬崩溃。我想了解一些如何在模块级别捕获它,发布一个事件,并将此模块从它所占用的区域中移除,而不是关闭整个应用程序

有人实现过这样的东西吗

应该避免这种类型的架构吗?

我在自己的工作中也遇到了同样的问题。涵盖以下所有方面似乎对我们有效:

DispatcherUnhandledException += OnDispatcherUnhandledException;

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

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
此外,对于模块和视图模型级别的异常,我们尝试/捕获,然后通过
EventAggregator
发布事件。在shell中,我们订阅此事件以显示/记录错误。由于外壳最有可能包含所有区域,因此您应该能够从视图中删除/隐藏这些模块。但是,我将声明无法卸载模块。这可能不是最佳解决方案,我们仍在探索更好的方法

外壳:

EventAggregator.GetEvent<RaisedExceptionEvent>().Subscribe(RaisedException);
EventAggregator.GetEvent().Subscribe(RaisedException);
视图模型:

try
{
}
catch (Exception ex)
{
            EventAggregator.GetEvent<RaisedExceptionEvent>().Publish(new ExceptionManager(ex,
                                                                                          ExceptionMessageType.
                                                                                              Default, true));
}
试试看
{
}
捕获(例外情况除外)
{
EventAggregator.GetEvent().Publish(新异常管理器(例如,
例外消息类型。
默认值(true));
}

我也在考虑同样的问题,除了一些不必尝试/捕获的问题(但我认为不可能绕开)。另外,我并不是要卸载一个模块……我只是想让regionmanager将它从它所在的区域中删除。我还发现这个链接很有用是的,这个链接也在做同样的事情,只是它只覆盖了主UI线程,而且通常是不可恢复的。通过使用pub/sub,您将拥有try/catch,但您可以恢复,如果您有未处理的内容,您至少可以在关闭应用程序之前记录/显示它。在这一点上,我们还没有找到避免尝试/捕获的方法。。如果你找到一个好的解决方案,请分享。