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

我在MSDN上关注这个例子

Handle errors and exceptions that occur with databinding(
same example also here)

这个例子背后的想法:

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

到现在为止还挺好.

这是奇怪的部分.对于不同版本的.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)

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

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

Using exceptions for user input validation isn’t great.

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

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

That example is WinForms. Why don’t you use WPF?

因为遗留问题,我正在使用WinForms.

最佳答案 这似乎是.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”调试.

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

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

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

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

点赞