我无法弄清楚为什么我无法捕获MS Chart控件抛出的异常。我正在使用带有最新更新的Visual Studio 2010。感谢你的帮助。
以下是重新制作问题的方法:
在表单的构造函数
中添加以下代码 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);
将以下代码添加到按钮的单击方法
try
{
chart1.Series[0].Label = "#VAL{";
}
catch
{
MessageBox.Show("Exception caught");
}
上面的catch块永远不会执行。相反,标签字符串中无效关键字use抛出的“InvalidOperationException”会冒泡到应用程序的Main方法。
答案 0 :(得分:1)
这不是控件的不常见故障模式。问题在于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块中重新分配Label属性。唯一真正的解决方法是修复代码。如果您允许用户输入标签,那么此解决方法应该是好的,只需确保重置catch块中的标签。
答案 1 :(得分:0)
Chart.Area.RecalculateAxesScale()
由于某种原因不可用,也可以使用 Chart.Refresh()
。