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

如何在更新版本的.NET(3.5以上)中处理数据绑定期间发生的异常?,.net,winforms,validation,data-binding,exception-handling,.net,Winforms,Validation,Data Binding,Exception Handling,下面是MSDN中的示例 () 这个例子背后的想法是: 文本框控件使用BindingSource和Binding对象绑定到业务对象属性。业务对象就是模型 业务对象中的属性设置器验证输入,并在输入无效时引发异常 绑定对象被配置为捕获此类异常 绑定触发BindingComplete事件。如果存在异常,则会捕获该异常,并且可以通过BindingCompleteEventArgs获取异常消息。验证错误消息可以通过这种方式流回到表示层 到目前为止,一切都很好 这是奇怪的部分。对于不同版本的.NET,捕获业务

下面是MSDN中的示例
()

这个例子背后的想法是:

  • 文本框控件使用
    BindingSource
    Binding
    对象绑定到业务对象属性。业务对象就是模型
  • 业务对象中的属性设置器验证输入,并在输入无效时引发异常
  • 绑定对象被配置为捕获此类异常
  • 绑定触发
    BindingComplete
    事件。如果存在异常,则会捕获该异常,并且可以通过
    BindingCompleteEventArgs
    获取异常消息。验证错误消息可以通过这种方式流回到表示层
  • 到目前为止,一切都很好

    这是奇怪的部分。对于不同版本的.NET,捕获业务对象引发的异常的方式各不相同

    • 这适用于.NET 3.5版。绑定框架捕获异常<代码>绑定完成事件被触发。事件参数表明绑定未成功。正如所料
    • .NET版本4.0、4.5、4.5.2在模型的属性设置器中没有捕获异常。执行因该异常而中断
    相同的源代码从微软的例子复制粘贴。我只在项目属性中更改.NET的版本

    • 较新版本的.NET中发生了什么变化,导致此示例无法按预期工作
    • 有没有一种方法可以在较新版本的.NET上实现这一点?该示例是否缺少在较新版本的.NET中引入的设置
    附录A:相关阅读和现有技术 在此之前的线程中也提出了类似的方法:

    建议在
    Binding.Parse
    事件中抛出异常的 [奇怪的是,即使控件中的
    e.Cancel
    设置为
    true
    ,也会发生数据绑定。正在验证事件处理程序。这是一个功能吗?]

    附录B:对预期评论的先发制人回应 使用异常进行用户输入验证并不好

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

    话虽如此,我也愿意接受其他想法。模型是否有其他方法进行输入验证并向演示文稿发送验证错误信息

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


    我之所以使用WinForms是因为遗留问题。

    这似乎与.Net 3.5和.Net 4+中归类为用户未处理异常的内容有所不同。在.Net 4.0中可能没有发生此更改,因为.Net 4.5+已取代.Net 4

    考虑主题代码的属性设置程序中抛出的
    系统.Exception
    的以下配置。以下图像是从VS2013拍摄的。VS2015+使用不同的异常设置对话框(请参阅:)。要查看用户未处理选项,需要启用“仅我的代码”调试

    根据.Net 4.7编译时,当引发异常时,调试器将中断。但是,当根据.NET3.5编译时,抛出异常时调试器不会中断


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

    “4.0、4.5、4.5.2版的.Net版本不会在模型的属性设置器中捕获异常。”--我想您的意思是:“4.0、4.5、4.5.2版的.Net版本会在模型的属性设置器中捕获异常。”,这似乎是附加了调试器的未处理异常处理中的更改。如果清除“当此异常类型为用户未处理时中断”框,将获得与3.5相同的行为。如果运行时未连接调试器,则行为与.Net版本相同。@TnTinMn我不知道Visual Studio区分未处理和用户未处理。我读过,也读过。你给我指明了正确的方向。如果你从你的评论中做出回答,我会接受的。