WPF应用程序中的异常日志记录,MVVMLight SimpleIoC隐藏异常而不是抛出异常

时间:2014-01-09 10:10:55

标签: c# wpf exception-handling mvvm-light ioc-container

我有一个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 articlethis article关于异常处理,捕获(和吞下)这样的异常是糟糕的设计,因为它可能会隐藏应用程序中的错误。但我可能会弄错。

最后,这是我的问题: 如何记录构建ViewModel期间发生的异常?


底线: MVVMLight非常好,我喜欢它!感谢Laurent Bugnion以及到目前为止为此项目做出贡献的所有人。

1 个答案:

答案 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;)。