我有一个采用M-V-VM架构编写的应用程序。
数据访问是在Model中完成的。如果发生致命错误(例如,与数据源的连接丢失),将抛出异常。此异常会传递到ViewModel。
然而,由于数据访问的原始触发器是数据绑定,在WPF中会吞噬这个异常(仅在调试器下运行应用程序时才在输出窗口中记录该异常)。
我希望这个异常保持未处理状态,以便我的应用程序级别的未处理异常处理程序可以捕获它,记录它并优雅地退出。我该怎么做?
我有一个采用M-V-VM架构编写的应用程序。
数据访问是在Model中完成的。如果发生致命错误(例如,与数据源的连接丢失),将抛出异常。此异常会传递到ViewModel。
然而,由于数据访问的原始触发器是数据绑定,在WPF中会吞噬这个异常(仅在调试器下运行应用程序时才在输出窗口中记录该异常)。
我希望这个异常保持未处理状态,以便我的应用程序级别的未处理异常处理程序可以捕获它,记录它并优雅地退出。我该怎么做?
// 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 "";
}
}
}
ApplicationException
可以吗?根据微软的设计指南,你的应用程序不应该抛出它们。像InvalidOperationException
这样的异常是否更合适? - keplerianApplicationException
是“最佳实践”。我不确定微软何时改变了他们的想法。 - Andrew Shepherd最近发现了一种全局解决异常问题的方法(链接1)。
创建一个自定义绑定类并重写UpdateSourceExceptionFilter - 在此线程中查看示例。
不幸的是,这仅适用于WPF 4.0而不是SL 4.0。