我无法在Invoked委托中捕获异常

时间:2011-08-04 20:56:57

标签: c# visual-studio exception visual-studio-debugging

我有一个委托附加到Excel互操作组件中的事件。目标是使用Excel中的更新信息更新winforms控件。由于我正在更改Control属性,我需要使用Invoke:

public delegate void DataGridViewUpdate(object[,] data);

...

excel.InteractiveEdit( delegate(object[,] data) { 
    Invoke(new Common.DataGridViewUpdate(back_from_excel), new object[] { data }); 
});

...

private void back_from_excel(object[,] data) {
    // datagridview updating code
    // an exception is thrown here !
}

(此代码位于我正在更新的Form类中,因此它在this上调用)

基本上我的问题是当back_from_excel(object[,] data)方法中发生异常时,调试器无法捕获它。我知道委托在正确的UI线程中运行,因为我没有操作表单控件的问题。

具体而言,当back_from_excel遇到未处理的异常时,它会在该点停止执行。应用程序的其余部分继续运行并且响应迅速。调试器不会暂停。输出窗格显示:

A first chance exception of type 'System.NullReferenceException' occurred in My Application.exe
A first chance exception of type 'System.NullReferenceException' occurred in System.Windows.Forms.dll

它没有给我任何关于哪一行导致问题的提示,只是它在.exe中的某个地方。

我的问题是:我正在做Invoke这件事吗?让委托 - Invoke - 委托链接在一起似乎有点奇怪,但我确实需要传递一个委托调用委托。我的问题是在Visual Studio中而不是在C#中吗?如果是这样,我如何将调试器重新附加到该UI线程?

1 个答案:

答案 0 :(得分:2)

“第一次机会异常”表示抛出异常,但它在某个时刻被捕获。由于您将委托传递给InteractiveEdit方法,因此该方法可以轻松地吞下委托生成的任何异常。

默认情况下,Visual Studio将仅捕获未捕获的异常。如果要捕获所有异常,无论它们是否被捕获,您都需要配置Visual Studio以中断所有异常。有关如何执行此操作的详细信息,请参阅this link