在ViewModel/Model中处理致命异常

13

我有一个采用M-V-VM架构编写的应用程序。

数据访问是在Model中完成的。如果发生致命错误(例如,与数据源的连接丢失),将抛出异常。此异常会传递到ViewModel。

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

我希望这个异常保持未处理状态,以便我的应用程序级别的未处理异常处理程序可以捕获它,记录它并优雅地退出。我该怎么做?


1
相关的问题在这里(https://dev59.com/UXRA5IYBdhLWcg3w8SiJ)和这里(https://dev59.com/iXNA5IYBdhLWcg3wZ85S)都有最佳解决方案的答案,以我个人的看法。 - Andre Luus
2个回答

8
您可以在调度程序上排队一个抛出异常的操作。
    // 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 "";
            }
        }
    }

2
当我的绑定在“LostFocus”上触发时,这对我没有起作用,直到我更改(降低,我推测)了“BeginInvoke”优先级:“Dispatcher.CurrentDispatcher.BeginInvoke(throwException, DispatcherPriority.ContextIdle)”。 - Andre Luus
@Andrew Shepherd:抛出ApplicationException可以吗?根据微软的设计指南,你的应用程序不应该抛出它们。像InvalidOperationException这样的异常是否更合适? - keplerian
1
@Keplerian - 注意,这个答案已经有8年了。起初使用ApplicationException是“最佳实践”。我不确定微软何时改变了他们的想法。 - Andrew Shepherd

6

最近发现了一种全局解决异常问题的方法(链接1)

创建一个自定义绑定类并重写UpdateSourceExceptionFilter - 在此线程中查看示例。

不幸的是,这仅适用于WPF 4.0而不是SL 4.0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接