处理ViewModel/Model中的致命异常

Ian*_*ory 13 .net c# wpf exception-handling mvvm

我有一个使用MV-VM方法编写的应用程序.

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

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

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

And*_*erd 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 "";
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 当我在`LostFocus`上触发绑定时,这对我不起作用,直到我改变(降低,我推测)`BeginInvoke`优先级:`Dispatcher.CurrentDispatcher.BeginInvoke(throwException,DispatcherPriority.ContextIdle)`. (2认同)

Adr*_*ell 6

最近遇到了一种以全球方式解决吞噬异常问题的方法.

创建自定义绑定类并重写UpdateSourceExceptionFilter - 请参阅此线程中的示例.

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