【问题标题】:Prism Module Level Exception HandlingPrism 模块级异常处理
【发布时间】:2012-11-04 12:19:30
【问题描述】:

我正在尝试查看除了全局级别处理(Application.UnhandledException)之外是否可以在视图模型级别处理异常。目前,如果其中一个视图模型抛出未捕获的错误,则应用程序将硬崩溃。我想知道如何在模块级别捕获这个,发布一个事件,然后将该模块从它所占用的区域中删除,而不是删除整个应用程序。

有没有人实现过这样的东西?
应该避免这种类型的架构吗?

【问题讨论】:

    标签: c# exception mvvm exception-handling prism


    【解决方案1】:

    我在自己的工作中遇到了同样的问题。涵盖以下所有内容似乎对我们有用:

    DispatcherUnhandledException += OnDispatcherUnhandledException;
    
    TaskScheduler.UnobservedTaskException +=TaskScheduler_UnobservedTaskException; \\exceptions in tasks
    
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    

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

    壳牌:

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

    视图模型:

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

    【讨论】:

    • 我在考虑相同的行,除了一些如何不必执行 try/catch (但我认为不可能绕过)。此外,我并不是要卸载模块...我只是希望区域管理器将其从它所在的区域中删除。我还发现此链接很有用 stackoverflow.com/questions/4625825/…
    • 是的,那个链接做同样的事情,除了它只覆盖主 UI 线程并且通常是不可恢复的。通过使用 pub/sub,您将拥有 try/catch,但您可以恢复,如果您有未处理的事情,您至少可以在关闭应用程序之前记录/显示它。目前,我们还没有找到避免 try/catch 的方法。如果您找到了好的解决方案,请分享。
    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 2012-02-16
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多