gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:35:18 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
VS2010 does not show unhandled exception message in a WinForms Application on a 64-bit version of Windows



我刚刚安装并开始使用 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 块 - 但调试器的行为就像整个项目都包含在一个中一样)。

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

发现另一个 question有人遇到了这个问题,问题似乎出在 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 中应用了修补程序对我有用。应该在 Debug模式下导致异常和中断执行的代码,运行 Form_Load 事件,现在按预期执行此操作。这是启用了Application Framework,Form1作为启动对象,上面的代码注释掉了。

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

vshost.exe - Application Error INTERNAL ERROR: Unhandled exception in Debugger::HandleIPCEvent. Event ID=0x246 Exception code=0x0000005, Eip=0x70d58101. Process ID=0xbec (3052), Thread ID=0xb1c (2844).



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

最佳答案

我想你的代码在 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

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

关于.net - VS 2012 (VB.net) 忽略 Windows 7 64 位上未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13403487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com