【问题标题】:I can't catch exceptions in an Invoked delegate我无法在 Invoked 委托中捕获异常
【发布时间】:2011-10-20 09:02:09
【问题描述】:

我有一个附加到 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 的事情对吗?将委托 - 调用 - 委托像这样链接在一起似乎有点奇怪,但我确实需要传递一个调用委托的委托。我的问题是在 Visual Studio 中而不是在 C# 中吗?如果是这样,我如何将调试器重新附加到该 UI 线程?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢;在调试器中捕获所有异常的设置足以满足我的需要。我仍然不明白异常发生在哪里;它们当然没有被我的代码捕获,它们是通常由程序员处理的错误(如空引用异常)。
    • @Brian:我猜excel.InteractiveEdit 方法是 Excel 互操作库的一部分,对吧?它可能会吞下您发送给它的委托产生的异常,以保持其内部完整性。
    • 不,其实 InteractiveEdit 是我自己的方法。它将委托添加到由 Excel 互操作触发的事件中。不过,您可能是对的;这让我对这种怪异感觉好多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2021-08-07
    • 2021-10-14
    • 2019-11-27
    相关资源
    最近更新 更多