【问题标题】:How to handle exceptions that occur during databinding in newer versions of .NET (above 3.5)?如何处理在较新版本的 .NET(3.5 以上)中数据绑定期间发生的异常?
【发布时间】:2018-09-05 02:12:46
【问题描述】:

我正在关注 MSDN 中的这个示例
Handle errors and exceptions that occur with databinding (same example also here)

这个例子背后的想法:

  1. TextBox 控件使用BindingSourceBinding 对象绑定到业务对象属性。业务对象是模型。
  2. 业务对象中的属性设置器验证输入并在输入无效时引发异常。
  3. 绑定对象配置为捕获此类异常。
  4. 绑定触发BindingComplete 事件。如果有异常,就会被捕获,异常消息可通过BindingCompleteEventArgs 获得。验证错误消息可以通过这种方式回传到表示层。

到目前为止 - 非常好。

这是奇怪的部分。业务对象抛出的异常的捕获因 .NET 的不同版本而异。

  • 这适用于 .NET 版本 3.5 。绑定框架捕获异常。 BindingComplete 事件被触发。事件参数表明绑定不成功。正如预期的那样。
  • .NET 版本 4.0、4.5、4.5.2 不会在模型的属性设置器中捕获异常。执行因该异常而中断。

从 Microsoft 的示例中复制粘贴相同的源代码。我只在项目属性中更改 .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:对预期 cmets 的抢先响应

使用异常进行用户输入验证并不是很好。

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

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

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

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

【问题讨论】:

  • “.NET 版本 4.0、4.5、4.5.2 没有在模型的属性设置器中捕获异常。” - 我认为您的意思是:“.NET 版本 4.0、4.5、4.5.2 在模型的属性设置器中捕获异常。”也就是说,它似乎是附加了调试器的未处理异常处理的变化。如果您清除“当此异常类型为用户未处理时中断”框,您将获得与 3.5 相同的行为。如果您在没有附加调试器的情况下运行,则行为与 .Net 版本无关。
  • @TnTinMn 我不知道 Visual Studio 区分 unhandleduser-unhandled。我读过thisthis。你为我指明了正确的方向。如果您根据您的评论做出回答,我会接受。

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


【解决方案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)。要查看 user-unhandled 选项,您需要启用“Just-My-Code”调试。

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

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

【讨论】:

    猜你喜欢
    • 2019-09-25
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多