gpt4 book ai didi

c# - WPF 应用程序中的异常记录,MVVMLight SimpleIoC 隐藏异常而不是抛出它们

转载 作者:行者123 更新时间:2023-11-30 17:50:06 27 4
gpt4 key购买 nike

我有一个 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;
}
}

问题在于 SimpleIoC“吞噬”了 ViewModel 中抛出的异常。示例:

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 和迄今为止为该项目做出贡献的每一个人。

最佳答案

我记录了一个事实,即 SimpleIoc 似乎将构造函数中发生的异常作为 codeplex 上的一个错误。

您可以在此处查看项目的状态:https://mvvmlight.codeplex.com/workitem/7681

更新

我做了更多测试并得出结论,这不是 SimpleIoc 的问题,但实际上是 WPF 如何在绑定(bind)属性中隐藏异常的症状(在本例中绑定(bind)的“Te​​stViewModelTestViewModel”属性ViewModelLocator 类)。

使用 SimpleIoc 获取 TestViewModel 的实例在 WPF View /控件之外会导致抛出异常(正如人们所期望的那样)。然后,这会被当时存在的任何处理程序捕获。

另一方面,在绑定(bind)属性中通过 SimpleIoc 获取 TestViewModel 的实例只会导致绑定(bind)失败,但异常似乎不会“升级”到 WPF 内部之外。异常会在调试时写入输出窗口,但这在测试/生产环境中用处不大。

所以,简而言之,我不认为 SimpleIoc 会隐藏异常(相反,它是“WPF 的东西”)。

关于c# - WPF 应用程序中的异常记录,MVVMLight SimpleIoC 隐藏异常而不是抛出它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21017172/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com