【发布时间】:2009-03-03 06:10:03
【问题描述】:
我遇到了一个问题,即从属性集访问器中抛出的异常没有被我的全局异常处理程序捕获。
我在一个更大的应用程序中遇到了这个问题,经过大量的牙齿故障排除后,我尝试并成功地在一个更简单的项目中复制了这个问题。
以下是代码和行为。有人可以解释一下这种行为以及我应该如何正确编码以实现所需的结果,即全局事件处理程序捕获的异常。
//Program.cs - Wire up global exception handling
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.Run(new Form1());
}
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show("Exception occured : " + e.Exception.Message);
}
*
//In main form create instance of class containing bound property and setup databinding
//to numericUpDown control
private void Form1_Load(object sender, EventArgs e)
{
_car = new Car();
_car.NumberOfWheels = 4;
numericUpDown1.DataBindings.Add(new Binding("Value", _car, "NumberOfWheels", true, DataSourceUpdateMode.OnPropertyChanged));
}
*
public int NumberOfWheels
{
get { return _numberOfWheels; }
set
{
if (value < 4)
//Throw some exception
throw new ArgumentNullException("Argument null exception trigger in Number Of Wheels property");
_numberOfWheels = value;
}
}
如果我在“throw new ArgumentNullException”行设置断点,当我更改 numericUpDown 控件(绑定到 NumberOfWheels 属性)的值时,程序肯定会在此时中断。然而,这是检测是否抛出异常的唯一方法。通过 UI 不会显示引发异常的消息,即它没有被全局异常处理程序捕获。
相反,如果我通过单击按钮更改属性的值,则会引发异常并被我的处理程序捕获,并显示一个消息框。
我错过了什么?
【问题讨论】:
标签: c# data-binding exception-handling