【问题标题】:Handling fatal exceptions in ViewModel/Model处理 ViewModel/Model 中的致命异常
【发布时间】:2011-01-22 03:43:39
【问题描述】:

我有一个使用 M-V-VM 方法编写的应用程序。

数据访问在模型中完成。如果此处发生致命错误(例如,与数据源的连接丢失),则抛出异常。这个异常会冒泡到 ViewModel。

但是,由于数据访问的原始触发器是数据绑定,因此 WPF 会吞下此异常(仅当应用程序在调试器下运行时才会记录在输出窗口中)。

我宁愿这个异常保持未处理,以便我的应用程序范围的未处理异常处理程序可以拾取它、记录它并优雅地退出。我怎样才能做到这一点?

【问题讨论】:

  • 相关questions here 有提供最佳解决方案恕我直言的答案。

标签: c# .net wpf mvvm exception-handling


【解决方案1】:

您可以在调度程序上排队一个抛出异常的操作。

    // This property is connected to the window using databinding
    public string ExceptionThrowingBoundedField
    {
        get
        {

            try
            {
                // This function might throw an exception
                return GetValueFromDatabase();               
            }
            catch (Exception ex)
            {
                ApplicationException exWrapper = new ApplicationException(
                    "Wrapped Exception",                                                     
                     ex
                );
                Action throwException = () => { throw exWrapper; };
                Dispatcher.CurrentDispatcher.BeginInvoke(throwException);
                return "";
            }
        }
    }

【讨论】:

  • 当我的绑定在LostFocus 上触发时,这对我不起作用,直到我更改(降低,我认为)BeginInvoke 优先级:Dispatcher.CurrentDispatcher.BeginInvoke(throwException, DispatcherPriority.ContextIdle)
  • @Andrew Shepherd:可以抛出 ApplicationException 吗?根据Microsoft's design guidelines,您的应用程序不应抛出它们。像InvalidOperationException 这样的东西会更合适吗?
  • @Keplerian - 注意这个答案是 8 岁。起初,使用ApplicationException 是“最佳实践”。我不确定微软何时改变主意。
【解决方案2】:

最近在全球范围内遇到a way of getting围绕吞噬异常问题。

创建一个自定义绑定类并覆盖UpdateSourceExceptionFilter - 请参阅此线程中的示例。

不幸的是,这只是 WPF 4.0 而不是 SL 4.0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2018-04-08
    • 1970-01-01
    相关资源
    最近更新 更多