VS 2012(VB.net)正在忽略Windows 7 64位上未处理的异常

VS 2012(VB.net)正在忽略Windows 7 64位上未处理的异常,.net,vb.net,visual-studio-2012,.net,Vb.net,Visual Studio 2012,可能重复: 我刚刚安装并开始使用VS2012。以前使用过VS2008 Express。VS2012在Win 7 64位上运行。(以前的开发环境是在XP 32位上) 刚刚完成了一个基础研究项目(WinForms,VB),发现VS忽略了未处理的异常。此操作的最后一行应导致异常: With cmd .Connection = sqlConn .CommandType = CommandType.StoredProcedure .CommandText = "NameOfStoredProce

可能重复:

我刚刚安装并开始使用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
但是代码只是继续运行

在“调试/异常”对话框中,对于每种类型的异常,我都有一个“抛出”和“用户未处理”复选框。“用户未处理”勾选所有。我不想勾选“抛出”,因为我将处理异常,不想打断已处理的异常。(现在,我根本没有Try…Catch块——但是调试器的作用就像整个项目都包含在一个块中一样)

我已经查看了所有选项等等,但找不到任何神奇的“打开异常时中断”选项。我寻求帮助的不是我的代码,而是在这种情况下,我无法相信调试器能够检测出我不可避免地会犯的愚蠢错误

在另一个地方发现有人遇到了这个问题,而问题似乎出在Win64上。但是VS在Win64上真的不可用吗?我不太相信这一点,但如果不打破未处理的异常,它将无法使用

编辑: 谢谢你的评论。我尝试了Neolik的解决方案,但不得不稍微更改代码,因为两个处理程序的签名不同:

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作为启动)。而且我是一个太多的.NET初学者,甚至不知道它的效果/优点/缺点是什么。我已经阅读了你们所有人提供的链接,了解了正在发生的事情,但如果我可以避免的话,我不想参与其中

幸运的是,在中应用修补程序对我起了作用。在调试模式下,在运行Form_Load事件时,应该会导致异常和执行中断的代码现在按预期执行此操作。这是启用了应用程序框架,Form1作为启动对象,上面的代码被注释掉了

EDIT2: 不,那个修补程序不起作用。原始的“坏参数名”行导致代码因异常而停止。但随后的一行出现DBNull->Int32转换异常,导致出现此错误框(不可能进行调试):

vshost.exe-应用程序错误内部错误:中未处理的异常 调试器::HandleIPCEvent。事件ID=0x246异常代码=0x0000005, Eip=0x70d58101。进程ID=0xbec(3052),线程ID=0xb1c(2844)


我真的很感激你的所有评论——但在我看来,这是一个破坏者:如果开发人员不相信异常是可调试的,他们怎么能使用VS呢?我不必记得每次我想开发东西的时候都要从一个Sub Main开始,然后把那些特殊的行放进去:或者记住不能在Form_Load中使用代码?我将建议我们停止使用Win7 64位作为开发操作系统。

我认为您的代码是以
的形式加载的,这可以解释这一点。如果是这种情况,请看我的问题:。这是一个众所周知的问题。您需要将您的代码从
表单加载中删除
,或者让您的应用程序从
Sub-Main开始
,并将您已经找到的3条神奇的C行放入其中。下面是VB.NET的3行代码:

AddHandler Application.ThreadException, AddressOf YourExceptionHandler
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf YourExceptionHandler

就我所记得的,第一行实际上解决了这个问题,另外两行是为了掩盖其他神秘的错误。为了安全起见,总是在程序的一开始就将它们全部包括在内,这并不有害
YourExceptionHandler
可以是空方法。添加这三行后,异常捕获应按预期开始工作。

我在Win7 64位上使用VS 2012,我的异常工作正常。尽管如此,请尝试更改目标.Net framework的版本。试试最新的。我读过一些实例,如果调试器正在调试一个不同的框架,那么项目正在运行,这种情况可能会发生。@HansPassant:同样的原因,不同的启动条件。OP正在使用VS 2012。对,它在VS2012中没有得到修复。它也不会在VS2021中修复。希望到那时我们再也不必关心这些了。@HansPassant:希望有一天微软会将这一行神奇的代码添加到引擎盖下的一个空的子组件上,让所有人都不用手动操作了。:)谢谢我希望我现在不必深入研究这种深度。我不得不在一个模块中的一个子主键中添加这个稍有不同的代码: