无法捕获MS Chart控件异常

时间:2012-05-17 04:14:46

标签: c# visual-studio-2010 exception .net-4.0 mschart

我无法弄清楚为什么我无法捕获MS Chart控件抛出的异常。我正在使用带有最新更新的Visual Studio 2010。感谢你的帮助。

以下是重新制作问题的方法:

  • 创建一个新的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);
    
  • 将以下代码添加到按钮的单击方法

        try
        {
            chart1.Series[0].Label = "#VAL{";
        }
        catch
        {
            MessageBox.Show("Exception caught");
        }
    
  • 运行应用程序
  • 点击表单
  • 上的按钮

上面的catch块永远不会执行。相反,标签字符串中无效关键字use抛出的“InvalidOperationException”会冒泡到应用程序的Main方法。

2 个答案:

答案 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()