第一次机会异常。

19

我有一个在Windows XP上运行完美的项目。

现在我尝试在Windows 7上运行它,在Immediate窗口下出现了很多异常。

A first chance exception of type 'System.ArgumentNullException' occurred in Microsoft.VisualBasic.dll
A first chance exception of type 'System.IO.FileNotFoundException' occurred in LP_Wizard.exe
A first chance exception of type 'System.ArgumentException' occurred in LP_Wizard.exe
A first chance exception of type 'System.NullReferenceException' occurred in LP_Wizard.exe
A first chance exception of type 'System.InvalidCastException' occurred in Microsoft.VisualBasic.dll
A first chance exception of type 'System.ArgumentNullException' occurred in Microsoft.VisualBasic.dll
A first chance exception of type 'System.IO.FileNotFoundException' occurred in LP_Wizard.exe
A first chance exception of type 'System.InvalidCastException' occurred in Microsoft.VisualBasic.dll
A first chance exception of type 'System.ArgumentNullException' occurred in Microsoft.VisualBasic.dll
A first chance exception of type 'System.IO.FileNotFoundException' occurred in LP_Wizard.exe
A first chance exception of type 'System.ArgumentNullException' occurred in Microsoft.VisualBasic.dll
A first chance exception of type 'System.IO.FileNotFoundException' occurred in LP_Wizard.exe

有没有想法知道在Windows 7中使用Microsoft.VisualBasic.dll出了什么问题,以及如何纠正这个问题?

非常感谢帮助。

3个回答

57
如果您想精确定位异常发生的地方,可以选择“调试(Debug)->异常(Exceptions)”菜单项,在弹出的对话框中勾选“常见语言运行时异常”复选框。这样,调试器会在异常发生时立即中断,而不是仅在未处理的异常上中断。
这也是为什么通常捕获通用异常是一个坏主意,除非您清楚地记录了捕获的信息。

非常感谢。我生成了数百个文件未找到的错误,这让我追踪并检查了出现错误的位置。 - mklauber
1
使用+1和捕获通用异常而不是使用流程控制会大大减慢您的应用程序。 - nima
非常有帮助。虽然这是一个旧的线程,但我已经花了将近两个星期的时间在解决遗留软件中的故障问题,主要是处理文件夹权限问题,而这个答案实际上帮助我在不到5分钟的时间内解决了所有问题。太棒了! - Jon
非常感谢。我在自定义控件DLL中出现了一个错误, 但是在宿主项目中,我将Debug..Exceptions.."Common Language Runtime Exceptions".."Throw"设置为Ticked(不要担心DLL项目中的“User-unhandled”设置或相同的设置),最后我终于可以看到DLL项目代码中实际的错误位置(即使Try..Catch仍在运行)。干杯! - AjV Jsy
非常感谢你。我在实体模型中遇到了通用异常,无法理解其原因。启用“常规语言运行时异常”救了我的一天! - Sandrous

44
发生的情况是调试器能够“看到”异常在任何catch块被触发之前就被提出了(这就是所谓的“第一次机会”)。任何未被catch块处理的异常都被视为“第二次机会”异常,并将正常中断。
如果这些异常没有因为未被处理而阻止应用程序运行,那么你可能没什么问题。大多数情况下,代码会处理异常,这不是问题。输出仅是Visual Studio让你知道异常被提出了。
如果有太多异常要处理,则可查看“避免已安全处理异常时出现第一次机会异常消息”问题以获得一些减少此类消息的方法。

6
此外,如果您正在触发许多异常并捕获并忽略它们,那么重新编写代码以避免这种情况可能会更加高效。例如,在调用之前使用 if(thing != null) 而不是之后使用 catch(NullPointerException)。 - Paolo
1
当然,Paolo。异常应该是异常的情况。当然,如果异常发生在Microsoft.VisualBasic.dll中,那么很不幸,您可能没有太多事情可以做。 :) - Adrian Clark
即使异常发生在 Microsoft.VisualBasic.dll 中,很可能是由于您自己代码中的错误而不是 Microsoft 代码中的错误引起的。 - MarkJ
但是我怎么能在代码中看到它们来自哪里呢? 我只是看不到它发生的地方。 - Night Walker
1
更改调试器设置,使其在第一次机会异常时停止。回顾调用堆栈,找到进入 Microsoft DLL 之前代码的最后部分。弄清楚你对 Microsoft 代码的调用有什么问题。如果一切正常,那么就像链接的问题中所述,关闭警告。 - MarkJ

1

你在调试器里吗?这些异常是你的程序处理的吗?如果是,你需要找到一个设置来告诉 VB 抑制警告已处理的异常。可能在 XP 上安装时这个设置被设置了,但是在 W7 上安装时没有。看看这是否有帮助:

http://www.helixoft.com/blog/archives/24


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接