Arhn - архитектура программирования

Получить параметры метода из метода метания в C #

У меня неприятное исключение, которое, кажется, происходит глубоко внутри кода DataGridView.

У меня есть класс, который наследуется от BindingList, который является источником данных объекта BindingSource, который является источником данных объекта DataGridView.

При некоторых странных обстоятельствах я получаю исключение во время переопределенного метода OnListChanged () моего класса:

    protected override void OnListChanged(ListChangedEventArgs e)
    {
        base.OnListChanged(e); // <-- ArgumentOutOfRangeException
                               // ...Parametername: rowIndex
    }

трассировка стека выглядит так:

    bei System.Windows.Forms.DataGridView.GetCellDisplayRectangle(Int32 columnIndex, Int32 rowIndex, Boolean cutOverflow)
    bei System.Windows.Forms.DataGridView.GetCellAdjustedDisplayRectangle(Int32 columnIndex, Int32 rowIndex, Boolean cutOverflow)
    bei System.Windows.Forms.DataGridView.InvalidateCellPrivate(Int32 columnIndex, Int32 rowIndex)
    bei System.Windows.Forms.DataGridView.OnCellCommonChange(Int32 columnIndex, Int32 rowIndex)
    bei System.Windows.Forms.DataGridView.DataGridViewDataConnection.ProcessListChanged(ListChangedEventArgs e)
    bei System.Windows.Forms.DataGridView.DataGridViewDataConnection.currencyManager_ListChanged(Object sender, ListChangedEventArgs e)
    bei System.Windows.Forms.CurrencyManager.OnListChanged(ListChangedEventArgs e)
    bei System.Windows.Forms.CurrencyManager.List_ListChanged(Object sender, ListChangedEventArgs e)
    bei System.Windows.Forms.BindingSource.OnListChanged(ListChangedEventArgs e)
    bei System.Windows.Forms.BindingSource.InnerList_ListChanged(Object sender, ListChangedEventArgs e)
    bei System.ComponentModel.ListChangedEventHandler.Invoke(Object sender, ListChangedEventArgs e)
    bei System.ComponentModel.BindingList`1.OnListChanged(ListChangedEventArgs e)
    bei My.Own.BindingList.OnListChanged(ListChangedEventArgs e)

Что ж, я мог бы просто добавить исключение try \ catch вокруг этого, но мне любопытно, почему это вообще происходит.

Кто-то однажды сказал мне, что я мог бы использовать могущественную силу отражений и System.Diagnostics.StackTrace, чтобы получить StackFrame, который вызывает исключение (это пока работает), и проверить параметры (я понятия не имею, как это сделать), которые Помогите мне, потому что, если я знаю значение из rowindex / columnindex, я мог бы отследить исключение.

Может ли кто-нибудь сказать мне, если это вообще возможно, получить параметры из исключения?

Заранее спасибо!

Обновлять:

Проблема, похоже, связана с некоторыми проблемами потоковой передачи и не имеет ничего общего с rowIndex. BindingList - это источник данных DataGridView. Если я добавляю элемент в список, срабатывает событие OnListChanged, которое заставляет dataGridView загружать свойства привязки данных из нового экземпляра T. В получателе одного свойства у меня был код, который изменил другое свойство, вызвавшее событие OnPropertyChanged объекта T instace быть уволенным.

Всего одна простая блокировка (this) в методе BindingList Add, как здесь: Кто-нибудь написал поточно-ориентированный BindingList ‹T›? решил проблему для меня. Трудно отлаживать; (


  • Да, действительно, проблемы с потоками очень сложно отладить. Рад, что ты его нашел! 10.12.2009

Ответы:


1

На первый взгляд (а также на второй и третий) Люк прав, но если посмотреть дальше, то, возможно, найдется выход. Проблема с использованием прямого подхода через класс StackTrace не работает просто потому, что этот класс хранит информацию о стеке, включая информацию о параметрах, но не данные параметров.

Эти данные будут доступны в отладочной версии, а не в версии выпуска. Чтобы получить эти данные, вы можете взаимодействовать с отладчиком Visual Studio. Вы можете сделать это программно. Однако я думаю, что проще вызвать Debugger.Break() (и, возможно, сначала проверить, подключен ли отладчик), а затем провести анализ.

Чтобы взаимодействовать с IDE и отладчиком, вот ответ, который объясняет как (в нем объясняется, как программно устанавливать точки останова, но это делается путем взаимодействия с IDE).

Чтобы найти нужную информацию, вы можете использовать методы автоматизации, которые будут доступны, когда вы в среде IDE пишете макрос. Было бы проще, если бы вы могли отразить свой путь к объектам в куче, и, возможно, он есть, но это единственный работоспособный метод, который я смог найти до сих пор.

04.12.2009
  • Я могу воспроизвести эту ошибку в своей среде разработки Visual Studio. Проблема в том, что DataGridView, кажется, прослушивает событие BindingList ‹T› ListChanged и вызывает исключение, когда мое свойство Prop1 изменяется. Prop1 имеет rowId 3 в сетке, поэтому мне любопытно, почему я получаю ArgumentOutOfRangeException, и хотел узнать, каково значение rowId в методе GetCellDisplayRectangle (...) на вершине стека. 07.12.2009
  • Если вы получили исключение во время отладки, откройте окно стека вызовов и дважды щелкните строку с GetCellDisplayRectangle() в стеке. Наведите указатель мыши на переменную или параметр rowId в этой функции, и вы увидите его значение. В качестве альтернативы вы можете создать условную точку останова до возникновения исключения, чтобы прервать выполнение этой функции на rowId==3. Для этого создайте точку останова GetCellDisplayRectangle, щелкните ее правой кнопкой мыши, выберите «Условие» и введите rowId == 3 в диалоговом окне «Условие». Автоматизировать любой процесс можно, но сложно, как показывает ссылка в моем ответе. 08.12.2009

  • 2

    К сожалению, вы не можете получить значения аргументов из трассировки стека или исключения.

    Для параметра ListChangedEventArgs доступны различные свойства, которые может помочь с отладкой: ListChangedType, _ 3_, _ 4_ и _ 5_.

    04.12.2009
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..