6

可能重复:
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

果然,立即窗口显示:

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 位作为开发操作系统。

4

1 回答 1

3

我认为你有你的代码Form_Load,因为这会解释它。如果是这种情况,请在此处查看我的问题:Explain critical bug in 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

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

于 2012-11-15T20:13:53.023 回答