如何处理在较新版本的.NET(大于3.5)中数据绑定期间发生的异常?

时间:2018-03-26 20:10:59

标签: .net winforms validation data-binding exception-handling

我在MSDN上关注这个例子 Handle errors and exceptions that occur with databindingsame example also here

这个例子背后的想法:

  1. 使用BindingSourceBinding对象将TextBox控件绑定到业务对象属性。业务对象是Model。
  2. 业务对象中的属性设置器验证输入并在输入无效时抛出异常。
  3. 绑定对象配置为捕获此类异常。
  4. 绑定会触发BindingComplete事件。如果有异常,则会被捕获,并且BindingCompleteEventArgs可以获得异常消息。验证错误消息可以通过这种方式回流到表示层。
  5. 到目前为止 - 非常好。

    这是奇怪的部分。对于不同版本的.NET,捕获业务对象抛出的异常会有所不同。

    • 这适用于.NET 3.5版。绑定框架捕获异常。 BindingComplete事件被触发。事件参数表明绑定不成功。正如所料。
    • .NET版本4.0,4.5,4.5.2不会在Model的属性设置器中捕获异常。执行中断了该异常。

    从微软的例子中复制相同的源代码。我只更改项目属性中的.NET版本。

    • 在较新版本的.NET中发生了哪些变化,以便此示例停止按预期工作?
    • 有没有办法让这个版本适用于较新版本的.NET?该示例是否缺少在较新版本的.NET中引入的设置?

    附录A:相关阅读和现有技术

    此早期帖子中也提出了类似的方法:Data Binding and throwing exception in setter (2009)

    thread on MSDN forum (2010)建议在Binding.Parse事件中抛出异常 [奇怪的是,即使在Control.Validating事件处理程序中将e.Cancel设置为true,也会发生数据绑定。这是一个功能吗?]

    附录B:对预期评论的抢先回应

      

    使用例外进行用户输入验证并不是很好。

    我同意。同时,如果参数是垃圾,模型中的属性设置器必须验证参数并抛出异常。不能有一个接受无效参数的模型。

    话虽如此,我也对其他想法持开放态度。模型是否有其他方式进行输入验证并将验证错误信息发送到演示文稿?

      

    这个例子是WinForms。你为什么不使用WPF?

    由于遗留问题,我正在使用WinForms。

1 个答案:

答案 0 :(得分:1)

这似乎与.Net 3.5和.Net 4+中被归类为用户未处理的异常的内容不同。 .Net 4.0可能不会发生这种变化,因为.Net 4.5+是.Net 4的就地替代品。

请考虑主题代码的属性设置器中引发的System.Exception的以下配置。从VS2013捕获以下图像。 VS2015 +使用不同的异常设置对话框(请参阅:The New Exception Settings Window in Visual Studio 2015)。要查看用户未处理的选项,您需要启用" Just-My-Code"调试。

enter image description here

enter image description here

当针对.Net 4.7进行编译时,调试器将在抛出异常时中断。但是,当针对.Net 3.5进行编译时,调试器在抛出异常时不会中断。

如果你清除"中断此异常类型是用户未处理的"在框中,您将获得与3.5相同的行为。如果在没有附加调试器的情况下运行,则无论.Net版本如何,行为都是相同的。