Почему не отрисовываются исключения при явном запросе элемента управления на перерисовку? - PullRequest
0 голосов
/ 17 июня 2011

У меня есть приложение с графическим интерфейсом, которое отображает данные, используя Windows::Forms::DataVisualization::Charting::Chart, который работает в большинстве случаев.Просто иногда мы получаем некоторые ложные данные, которые не нравятся элементу управления диаграммы, которые выдают исключение.Чтобы попытаться понять, что является причиной этих проблем, я завернул запрос на перерисовку в try / catch:

try
{
    m_chart->Invalidate();
    m_chart->Update();
}
catch(System::Exception^ e)
{
    // If something goes wrong during the drawing, we probably want to try 
    // and record some more information then re-throw it so we can capture 
    // it properly.
    String^ detailString = String::Format("Exception caught while trying to draw raw data. {0}", "Add more debug info here");
    throw gcnew System::Exception(detailString, e);
}

... по какой-то причине исключение там не выдается(У меня есть точка останова и некоторая регистрация, которая никогда не срабатывает) - это происходит в другой момент:

Exception:
    Value was either too large or too small for a Decimal.
Exception type:
    System.OverflowException
Source:
    mscorlib
Stack trace:
   at System.Decimal..ctor(Double value)
   at System.Windows.Forms.DataVisualization.Charting.Axis.RoundedValues(Double inter, Boolean shouldStartFromZero, Boolean autoMax, Boolean autoMin, Double& min, Double& max)
   at System.Windows.Forms.DataVisualization.Charting.Axis.EstimateNumberAxis(Double& minimumValue, Double& maximumValue, Boolean shouldStartFromZero, Int32 preferredNumberOfIntervals, Boolean autoMaximum, Boolean autoMinimum)
   at System.Windows.Forms.DataVisualization.Charting.Axis.EstimateAxis(Double& minimumValue, Double& maximumValue, Boolean autoMaximum, Boolean autoMinimum)
   at System.Windows.Forms.DataVisualization.Charting.Axis.EstimateAxis()
   at System.Windows.Forms.DataVisualization.Charting.ChartArea.SetDefaultAxesValues()
   at System.Windows.Forms.DataVisualization.Charting.ChartArea.SetData(Boolean initializeAxes, Boolean checkIndexedAligned)
   at System.Windows.Forms.DataVisualization.Charting.ChartArea.ReCalcInternal()
   at System.Windows.Forms.DataVisualization.Charting.ChartPicture.Paint(Graphics graph, Boolean paintTopLevelElementOnly)
   at System.Windows.Forms.DataVisualization.Charting.Chart.OnPaint(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Installed .net Versions:
    v2.0.50727.5420
    v3.0.30729.5420
    v3.5.30729.5420
    v4.0.30319

Я что-то здесь упустил?Не вызывает ли аннулирование / обновление то же самое повторное прорисовывание, что и какая-то другая часть насоса сообщений Windows?

1 Ответ

0 голосов
/ 17 июня 2011

Большинство фреймворков UI следуют этому типу паттернов.Invalidate и т. Д. Просто обновите флаги в состоянии окна, чтобы оно было перекрашено позже.

Если вы не можете обнаружить ошибку в коде рисования, вам придется обработать ThreadException.Перехват ошибки в коде рисования (или привязки данных) является предпочтительным решением, но если вы просто временно добавляете обработчик, чтобы увидеть, что это за данные, ThreadException должно работать нормально.

...