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

seb*_*ebt 6 .net vb.net visual-studio-2012

可能重复:
VS2010在64位版本的Windows上的WinForms应用程序中不显示未处理的异常消息

我刚刚安装并开始使用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
Run Code Online (Sandbox Code Playgroud)

果然,立即窗口显示:

A first chance exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll
Run Code Online (Sandbox Code Playgroud)

但代码只是继续运行!

在Debug/Exceptions对话框中,我为每种类型的异常都有一个"Thrown"和"User-Unhandled"复选框.所有人都勾选了"User-Unhandled".我不想勾选"Thrown",因为我将处理异常并且不想中断处理的异常.(现在,我没有尝试...根本没有Catch块 - 但是调试器就好像整个项目都包含在一个中一样).

我已经查看了所有选项等等,但找不到任何魔法"打开Break on Exception"选项.这不是我的代码我正在寻求帮助 - 这就是发生这种情况我不能相信调试器能够发现我不可避免地会犯下的愚蠢错误.

发现另一个问题,有人碰到了这个问题,而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
Run Code Online (Sandbox Code Playgroud)

这工作 - 谢谢!但它要求我禁用应用程序框架(否则应用程序不能使用Sub Main作为启动).TBH我是一个.NET初学者,甚至不知道它的影响/优点/缺点是什么.我已经阅读了你们所提供的链接,并了解了正在发生的事情,但如果我能避免它,就不想参与其中......

幸运的是,在KB976038中应用此修补程序对我有用.应该在调试模式下导致异常和执行中断的代码,运行Form_Load事件,现在按预期执行此操作.这是启用了Application Framework,Form1作为启动对象,以及上面注释的代码.

编辑2: 不,该修补程序不起作用.原始的"错误参数名称"行导致代码因异常而停止.但是具有DBNull-> Int32转换异常的后续行只会导致此错误框(并且没有调试可能性):

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

我非常感谢您的所有评论 - 但在我看来,这是一个交易破坏者:如果开发人员不相信异常可以调试,他们如何使用VS?我不应该记得从Sub Main开始并在每次我想要开发的东西时都放入那些特殊的行:或者记住你不能在Form_Load中使用代码?我将建议我们停止使用Win7 64位作为开发操作系统.

Neo*_*isk 3

我认为你的代码在 中Form_Load,因为这可以解释它。如果是这种情况,请查看我的问题:Explain Visual Studio 2010 and up, WinForms and WPF 中的关键错误。这是一个已知问题。您需要将您的代码移出Form_Load,或者让您的应用程序开始Sub Main并放置您已经为 C# 找到的 3 条神奇的代码。以下是 VB.NET 中的相同 3 行:

AddHandler Application.ThreadException, AddressOf YourExceptionHandler
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf YourExceptionHandler
Run Code Online (Sandbox Code Playgroud)

据我记得,第一行实际上解决了这个问题,其他两行是为了掩盖其他神秘的错误。为了安全起见,将它们全部包含在程序的一开始并没有什么坏处。YourExceptionHandler可以是一个空方法。添加这 3 行后,异常捕获应该开始按预期工作。


归档时间:

查看次数:

3987 次

最近记录:

13 年,3 月 前