3

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 ブロックは実行されません。代わりに、ラベル文字列での無効なキーワードの使用によってスローされた "InvalidOperationException" が、アプリケーションの Main メソッドに到達します。

4

2 に答える 2

2

これは、コントロールの一般的な障害モードではありません。問題は、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プロパティを再割り当てしない限り。唯一の本当の治療法は、コードを修正することです。ユーザーにラベルの入力を許可する場合、この回避策は適切です。必ずキャッチブロックのラベルをリセットしてください。

于 2012-05-17T11:29:03.797 に答える
0

Chart.Area.RecalculateAxesScale()Chart.Refresh()何らかの理由で利用できない場合にも使用できます。

于 2016-07-12T12:51:58.923 に答える