C# 无法捕获MS图表控件异常
我不明白为什么我无法捕获MS图表控件引发的异常。我正在使用VisualStudio2010,其中包含最新的更新。感谢你的帮助 以下是如何重新制作该期:C# 无法捕获MS图表控件异常,c#,visual-studio-2010,exception,.net-4.0,mschart,C#,Visual Studio 2010,Exception,.net 4.0,Mschart,我不明白为什么我无法捕获MS图表控件引发的异常。我正在使用VisualStudio2010,其中包含最新的更新。感谢你的帮助 以下是如何重新制作该期: 创建新的WinForms应用程序 添加对System.Windows.Forms.DataVisualization的引用 在主窗体上,放置一个按钮和一个图表控件 在窗体的构造函数中添加以下代码 int[] x = new int[] { 1, 2, 3, 4, 5 }; int[] y = new int[] { 5, 13,
- 创建新的WinForms应用程序
- 添加对System.Windows.Forms.DataVisualization的引用
- 在主窗体上,放置一个按钮和一个图表控件
- 在窗体的构造函数中添加以下代码
int[] x = new int[] { 1, 2, 3, 4, 5 }; int[] y = new int[] { 5, 13, 4, 10, 9 }; chart1.Series[0].Points.DataBindXY(x, y);
- 将以下代码添加到按钮的click方法
try { chart1.Series[0].Label = "#VAL{"; } catch { MessageBox.Show("Exception caught"); }
- 运行应用程序
- 单击表单上的按钮
上面的catch块永远不会执行。相反,由标签字符串中的无效关键字use引发的“InvalidOperationException”会冒泡到应用程序的主方法。对于控件来说,这是一种常见的失败模式。问题在于Label属性的属性设置程序没有执行足够的检查来验证指定的值是否合法。因此,当实际使用属性值时,就会出现错误。稍后,当控件绘制自身时。在“调用堆栈”窗口中很容易看到,请注意Chart.OnPaint()如何位于堆栈顶部。调试器在Application.Run()处停止,因为这是它实际具有源代码的最后一条语句。因此,请确保在调用堆栈中查找 Winforms中存在对此的对策,Application.ThreadException事件将触发。但当您调试时,它会关闭,这是一种帮助您诊断异常的功能。无论如何这是不实际的,ThreadException的事件处理程序无法修复代码中的错误。您可以捕获异常,您必须强制重新绘制,以便绘制不会延迟,并在您的try块仍然有效时爆炸:
private void button1_Click(object sender, EventArgs e) {
try {
chart1.Series[0].Label = "#VAL{";
chart1.Refresh();
}
catch {
MessageBox.Show("Exception caught");
}
}
但这也不是一个真正的修复方法,它只会在下次重新喷漆时再次爆炸。除非在捕捉块中重新指定标签特性。唯一真正的解决办法是修复代码。如果您允许用户输入标签,那么此解决方法应该是好的,只需确保在catch块中重置标签。
Chart.Area。如果由于某种原因,Chart.Refresh()
不可用,也可以使用RecreacteAxesCale()
。您是从另一个线程执行此操作的吗?不是真的。复制我提到的问题的步骤使用标准的单线程winforms应用程序模板。很有意义!感谢您的解释。重置catch块中的正确标签后,图表将不会刷新。但我想这是另一个问题。希望属性设置程序执行所需的检查,或者该类是否提供了ValidLabel()方法。无论如何。。