我刚刚安装并开始使用 VS2012。之前用的是VS2008 Express。VS2012 在 Win 7 64 位上运行。(以前的开发环境是 XP 32 位)。
刚刚完成了一个基础研究项目(WinForms,VB),发现VS忽略了未处理的异常。最后一行应该会导致异常:
With cmd
.Connection = sqlConn
.CommandType = CommandType.StoredProcedure
.CommandText = "NameOfStoredProcedure"
.Parameters.Add("@TheParameterName", SqlDbType.Int, -1)
.Parameters("@TheParameterNameWithATypo").Direction = ParameterDirection.ReturnValue
果然,立即窗口显示:
A first chance exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll
但是代码只是继续运行!
在 Debug/Exceptions 对话框中,我为每种类型的异常设置了一个“Thrown”和“User-Unhandled”复选框。全部勾选“用户未处理”。我不想勾选“Thrown”,因为我将处理异常并且不想中断已处理的异常。(现在,我根本没有 Try...Catch 块——但调试器的行为就像整个项目都包含在一个项目中一样)。
我查看了所有选项等等,但找不到任何神奇的“打开异常中断”选项。我要寻求帮助的不是我的代码——而是因为发生这种情况,我无法相信调试器会检测到我不可避免地会犯的愚蠢错误。
发现另一个问题,有人遇到这个问题,问题似乎与Win64有关。但是VS真的不能在Win64上使用吗?我不能完全相信——但没有有效地打破未处理的异常会使其无法使用。
编辑: 感谢您的所有评论。我尝试了 Neolisk 的解决方案,但不得不稍微更改代码,因为两个处理程序的签名不同:
Public Sub Main()
AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionHandler
Form1.Show()
End Sub
Friend Sub ThreadExceptionHandler(sender As Object, e As System.Threading.ThreadExceptionEventArgs)
End Sub
Friend Sub UnhandledExceptionhandler(sender As Object, E As System.UnhandledExceptionEventArgs)
End Sub
这有效 - 谢谢!但它要求我禁用应用程序框架(否则应用程序不能使用 Sub Main 作为启动)。TBH 我是一个 .NET 初学者,甚至无法确定它的效果/优点/缺点是什么。我已经阅读了你们都提供的链接,并了解正在发生的事情,但如果我可以避免的话,我不想参与其中......
幸运的是,在KB976038中应用修补程序对我有用。应该在调试模式下导致异常和执行中断的代码,运行 Form_Load 事件,现在按预期执行此操作。这是启用了应用程序框架,Form1 作为启动对象,上面的代码被注释掉了。
EDIT2: 不,该修补程序不起作用。原始的“错误参数名称”行导致代码因异常而停止。但是带有 DBNull->Int32 转换异常的后续行只是导致了这个错误框(并且没有调试的可能性):
vshost.exe - 应用程序错误内部错误:Debugger::HandleIPCEvent 中未处理的异常。事件 ID=0x246 异常代码=0x0000005,Eip=0x70d58101。进程 ID=0xbec (3052),线程 ID=0xb1c (2844)。
我非常感谢您的所有评论 - 但在我看来,这是一个大问题:如果开发人员不相信异常可以调试,他们如何使用 VS?每次我想开发某些东西时,我不应该记住从 Sub Main 开始并放入那些特殊的行:或者记住不能在 Form_Load 中使用代码?我将建议我们停止使用 Win7 64 位作为开发操作系统。