我有一个委托(delegate),它附加到 Excel 互操作组件中的一个事件。目标是使用来自 Excel 的更新信息更新 winforms 控件。由于我正在更改控件属性,因此我需要使用调用:
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)
方法中发生异常时,调试器不会捕获它。我知道委托(delegate)在正确的 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
操作?将委托(delegate) - 调用 - 委托(delegate)像那样链接在一起似乎有点奇怪,但我确实需要传递一个调用委托(delegate)的委托(delegate)。我的问题是在 Visual Studio 中而不是在 C# 中吗?如果是这样,我如何让调试器重新附加到该 UI 线程?
最佳答案
“第一次机会异常”表示抛出异常,但在某个时刻被捕获。由于您将委托(delegate)传递给 InteractiveEdit 方法,因此该方法可以轻松吞下委托(delegate)产生的任何异常。
默认情况下,Visual Studio 只会捕获未捕获的异常。如果要捕获所有异常,无论是否捕获,都需要配置 Visual Studio 以在所有异常时中断。参见 this link有关如何执行此操作的详细信息。
关于c# - 我无法在调用的委托(delegate)中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6948416/