我有一个LoB WPF应用程序,需要找到一种方法来处理&全局记录异常。
知道我在做这样的事情:
public partial class App : Application
{
public App()
{
this.Dispatcher.UnhandledException += OnDispatcherUnhandledException;
}
void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
string errorMessage = string.Format("An unhandled exception occurred: {0}", e.Exception.Message);
MessageBox.Show(errorMessage, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
e.Handled = true;
}
}
问题在于ViewModel中抛出的SimpleIoC“吃掉”异常。 例如:
public class TestViewModel : ViewModelBase
{
public TestViewModel()
{
throw new Exception("this exception will be catched by SimpleIoC, therefore i'm not able to handle it elsewhere");
}
}
我正在使用MVVMLight ViewModelLocator,如下所示:
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<TestViewModel>();
}
public TestViewModelTestViewModel
{
get
{
return ServiceLocator.Current.GetInstance<TestViewModel>();
}
}
public static void Cleanup()
{
SimpleIoc.Default.Unregister<TestViewModel>();
}
}
根据this article和this article关于异常处理,捕获(和吞下)这样的异常是糟糕的设计,因为它可能会隐藏应用程序中的错误。但我可能会弄错。
最后,这是我的问题: 如何记录构建ViewModel期间发生的异常?
底线: MVVMLight非常好,我喜欢它!感谢Laurent Bugnion以及到目前为止为此项目做出贡献的所有人。
答案 0 :(得分:1)
我记录了一个事实,即SimpleIoc似乎将构造函数中出现的异常作为codeplex上的错误。
您可以在此处查看项目的状态:https://mvvmlight.codeplex.com/workitem/7681
我已经做了一些测试并得出结论,这不是SimpleIoc的一个问题,但实际上是WPF如何掩盖绑定属性中的异常的一个症状(在这种情况下,绑定& #34; ViewModelLocator类上的TestViewModelTestViewModel&#34;属性。)
使用SimpleIoc在WPF视图/控件之外获取TestViewModel 的实例会导致抛出异常(正如人们所期望的那样)。然后由当时的任何处理程序捕获。
另一方面,在绑定属性中通过SimpleIoc获取TestViewModel的实例只会导致绑定失败,但异常似乎并未升级&#34;超越WPF的内部。调试时会将异常写入输出窗口,但这在测试/生产环境中没有多大用处。
因此,简而言之,我并不认为SimpleIoc正在掩盖异常(相反,它是&#34; WPF的东西&#34;)。