gpt4 book ai didi

c# - C#中throwing方法获取方法参数

转载 作者:行者123 更新时间:2023-11-30 16:35:26 24 4
gpt4 key购买 nike

我有一个讨厌的异常,它似乎发生在 DataGridView 代码的深处。

我有一个继承自 BindingList 的类,它是 BindingSource 的 DataSource,BindingSource 是 DataGridView 的 DataSoure。

在一些奇怪的情况下,我在重写我的类的 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 的新实例加载数据绑定(bind)属性。在一个属性的 getter 中,我有一些代码更改了另一个属性,这导致 T 实例的 OnPropertyChanged 事件被触发。

BindingList Add 方法中只有一个简单的锁(this),如下所示: Has anyone written a thread-safe BindingList<T>?为我解决了这个问题。难以调试 ;(

最佳答案

乍一看(以及第二和第三眼),卢克是对的,但进一步看可能有办法。通过 StackTrace 类使用直接方法的问题不起作用,只是因为该类存储堆栈信息,包括参数信息,但不存储参数数据。

此数据将在调试版本中提供,而不是在发布版本中提供。要获取该数据,您可以与 visual studio 的调试器进行交互。您可以通过编程方式执行此操作。但是,我认为调用 Debugger.Break()(并可能先检查是否附加了调试器)然后进行分析会更容易。

要与 IDE 和调试器交互,here's an answer that explains how (它解释了如何以编程方式设置断点,但通过与 IDE 交互来实现)。

要查找所需信息,您可以使用在 IDE 中编写宏时可用的自动化方法。如果您可以反射(reflect)到堆上的对象的方式会更容易,并且可能有一个,但这是迄今为止我能找到的唯一可行的方法。

关于c# - C#中throwing方法获取方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1845864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com