从C#中的throw方法中获取方法参数

时间:2009-12-04 09:31:01

标签: c# .net exception datagridview stack-trace

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

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

在某些奇怪的情况下,我在我的类的重写的OnListChanged()方法中遇到异常:

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

stacktrace看起来像这样:

    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实例加载数据绑定属性。 在一个属性的getter中,我有一些代码改变了另一个属性,导致T实例的OnPropertyChanged事件被触发。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

要查找您所追踪的信息,您可以使用在IDE编写宏时可用的自动化方法。如果你能够反映你在堆上的对象的方式会更容易,并且可能有一个,但这是我到目前为止唯一可行的方法。

答案 1 :(得分:1)

不幸的是,您无法从堆栈跟踪或异常中获取参数值。

ListChangedEventArgs参数提供了各种可能有助于调试的属性:ListChangedTypeNewIndexOldIndexPropertyDescriptor