Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法捕获MS图表控件异常_C#_Visual Studio 2010_Exception_.net 4.0_Mschart - Fatal编程技术网

C# 无法捕获MS图表控件异常

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,

我不明白为什么我无法捕获MS图表控件引发的异常。我正在使用VisualStudio2010,其中包含最新的更新。感谢你的帮助

以下是如何重新制作该期:

  • 创建新的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()方法。无论如何。。