由于对上一次问题的回答,我在这方面取得了一些进展。事实证明,这是已经覆盖了这里的东西的重复表现。TLDR版本:在Win64中调试Form_Load事件的行为“奇怪”。
我现在要做的是找到最好的方法来处理这个问题,并让VS正常工作,这样我就可以真正地进行编程/调试了。有这么多的设置,在不同的地方,这是很难跟踪他们的所有。我做了一套完整的测试,每一个组合:
a.构建平台:任何CPU或x64
b.“首选32位”(当选择N/A时)
c.只是我的代码(已启用/禁用)
d.中断所有抛出的异常(不仅仅是用户未处理的异常)
e.在Form.Load或Form.New中抛出异常。
保持不变:启用了应用程序框架;启动对象是Form1,因此从这个非用户代码调用:
Protected Overrides Sub OnCreateMainForm()
Me.MainForm = Global.TheNameOfMyApplication.Form1
End Sub不能在这里发布完整的结果,因为它很长,而且我也找不到在这些帖子中创建表格的方法。但是结论是,我从VS调试器中看到了4种不同的行为。从好到坏到严重丑恶:
1.导致异常的实际行上的中断。一切都好:这是“正确”的行为。
2.中断在OnCreateMainForm (上图)中的行。内在的例外会带来污点。无法让它在抛出异常的过程中破坏(例如,查看实际发生的情况)。
3.空白(无代码)窗口上的中断。顶部写着“没有可用的源:调用堆栈只包含外部代码”。
4.不间断。例外吞下去了。抛出异常的过程刚刚被放弃;抛出后的行不执行。节目继续进行,吹着快乐的口哨,希望我没有注意到。
显然,我想要行为1。这是我发现的。
我希望用Form.New而不是Form.Load (在回答我之前的问题时建议的)编写代码是一种解决办法。结果证明这不是。除非我遗漏了一些东西,否则唯一能让调试工作的方法就是对抛出的异常启用中断。我真的不想这样做;除其他外,我确实希望捕获和有选择地处理异常,并且打破所有抛出的异常使之成为一个完全可以使用的PITA。
(请记住,在我遇到这个问题之前,这个项目只是稍微过了Hello阶段--我还没有做任何奇怪的事情,我真的不想让皮塔调试器的行为出现在我的脖子上。)
实际上,我必须勾选所有“中断抛出的异常”框,以替代我真正想要的选项:

我还安装了前面的答案中提到的修补程序,并尝试在Sub主过程中设置异常处理程序,但这似乎也解决不了问题。这是我最好的选择吗?
发布于 2012-11-22 13:27:17
最简单的解决办法:使用Win8 ..。
Form_Load中的零异常除法,用VS2012 (VB)测试:
Win7x64
AnyCPU : Swallow
x86 : Swallow
x64 : App dies without noticeWin8x64
AnyCPU : Break into debugger
x86 : Break into debugger
x64 : App dies without notice所以,如果你只想让它起作用,你可以考虑用Win8进行测试.
发布于 2015-05-08 06:55:38
我怀疑这种情况发生在Form.New中,但我确认这种情况发生在Form.Load中。
根本原因: Form.Load运行在与常规表单事件不同的线程上,因此错误处理在那里有不同的行为。
Recommendation:避开Form.Load,将代码移动到Form.New和Form.Show。使用Form.Load是程序员从vba到vb.net的一种习惯,但在后者中,它有着完全不同的行为(本机适用于Windows),这是许多程序员所不知道的。
了解更多信息: 好的起点
https://stackoverflow.com/questions/13512977
复制相似问题