第一次机会例外
Posted
技术标签:
【中文标题】第一次机会例外【英文标题】:A first chance exception 【发布时间】:2011-01-02 11:38:35 【问题描述】:我有一个在 windows xp 下完美运行的项目。
现在我尝试在 Windows 7 下运行它,并在立即窗口下出现了很多异常。
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
有什么问题吗?我如何解决这个问题?
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:你在调试器中吗?您的程序正在处理这些异常吗?如果是这样,您需要找到一个设置来告诉 VB 禁止警告您处理的异常。也许这是在 XP 上安装时设置的,但不是在 W7 上安装时设置的。看看这是否有帮助:
http://www.helixoft.com/blog/archives/24
【讨论】:
【参考方案2】:正在发生的事情是调试器可以在触发任何catch
块之前立即“看到”异常(因此是“第一次机会”)。任何未被catch
块处理的异常都被视为“第二次机会”异常,并将正常中断。
如果这些异常没有因为未处理而停止您的应用程序的运行,那么您可能没问题。大多数情况下,异常是由代码处理的,这不是问题。输出只是让您知道引发异常的 Visual Studio。
如果有太多无法忽略,请参阅“Avoiding first chance exception messages when the exception is safely handled”问题,了解一些减少这种情况的方法。
【讨论】:
+1。此外,如果您要触发大量异常并捕获和忽略它们,则可能值得尝试重写代码以避免它,因为它会执行得更好。例如,在调用之前使用 if(thing != null) 而不是之后使用 catch(NullPointerException)。 当然,保罗。例外应该是例外。当然,如果 Microsoft.VisualBasic.dll 中发生异常,那么很遗憾,您可能做不了太多事情。 :) 即使异常发生在 Microsoft.VisualBasic.dll 中,也很可能是由您自己的代码中的错误引起的,而不是 Microsoft 代码中的错误。 但是我怎么能在代码中看到它们来自哪里?我只是看不到它发生的地方 更改调试器设置,使其在第一次机会异常时停止。在代码进入 Microsoft DLL 之前,回顾代码最后一部分的调用堆栈。找出您对 Microsoft 代码的调用有什么问题。如果一切正常,则只需关闭警告,如链接问题中所示。【参考方案3】:如果您想查明异常发生的位置,您可以选择 Debug->Exceptions 菜单项,并在出现的对话框中选中“Common Language Runtime Exceptions”的第一个复选框。这将使调试器在发生异常时立即中断,而不是仅在未处理的异常时中断。
这也是为什么捕获一般异常通常不是一个好主意的原因之一,除非您清楚地记录捕获的信息。
【讨论】:
非常感谢。我生成了数百个未找到的文件,这让我可以追踪并检查它发生的位置。 +1 并捕获通用异常而不是使用流控制会大大降低您的应用程序速度 巨大的帮助。这可能是一个旧线程,但在 2 周的大部分时间里,我一直在努力解决遗留软件的故障,主要处理文件夹权限问题,这个答案实际上帮助我在 5 岁以下修复了所有问题分钟。很好的提示! 非常感谢。我在自定义控件 DLL 中出现错误,但在宿主项目中我将 Debug..Exceptions.."Common Language Runtime Exceptions".."Throw" 设置为 Ticked(不要担心“用户未处理”设置,或 DLL 项目中的相同设置),最后我看到了 DLL 项目代码中实际错误的位置(即使 Try..Catch 仍在运行)。干杯! 我也非常感谢。我在实体模型中有一个通用异常,无法理解为什么。启用“Commong Language Runtime Exception”节省了我的时间!以上是关于第一次机会例外的主要内容,如果未能解决你的问题,请参考以下文章