首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VS2012调试行为在Form.Load和Form.New上的解决方案

VS2012调试行为在Form.Load和Form.New上的解决方案
EN

Stack Overflow用户
提问于 2012-11-22 12:42:03
回答 2查看 500关注 0票数 1

由于对上一次问题的回答,我在这方面取得了一些进展。事实证明,这是已经覆盖了这里的东西的重复表现。TLDR版本:在Win64中调试Form_Load事件的行为“奇怪”。

我现在要做的是找到最好的方法来处理这个问题,并让VS正常工作,这样我就可以真正地进行编程/调试了。有这么多的设置,在不同的地方,这是很难跟踪他们的所有。我做了一套完整的测试,每一个组合:

a.构建平台:任何CPU或x64

b.“首选32位”(当选择N/A时)

c.只是我的代码(已启用/禁用)

d.中断所有抛出的异常(不仅仅是用户未处理的异常)

e.在Form.Load或Form.New中抛出异常。

保持不变:启用了应用程序框架;启动对象是Form1,因此从这个非用户代码调用:

代码语言:javascript
运行
复制
Protected Overrides Sub OnCreateMainForm()
   Me.MainForm = Global.TheNameOfMyApplication.Form1
End Sub

不能在这里发布完整的结果,因为它很长,而且我也找不到在这些帖子中创建表格的方法。但是结论是,我从VS调试器中看到了4种不同的行为。从好到坏到严重丑恶:

1.导致异常的实际行上的中断。一切都好:这是“正确”的行为。

2.中断在OnCreateMainForm (上图)中的行。内在的例外会带来污点。无法让它在抛出异常的过程中破坏(例如,查看实际发生的情况)。

3.空白(无代码)窗口上的中断。顶部写着“没有可用的源:调用堆栈只包含外部代码”。

4.不间断。例外吞下去了。抛出异常的过程刚刚被放弃;抛出后的行不执行。节目继续进行,吹着快乐的口哨,希望我没有注意到。

显然,我想要行为1。这是我发现的。

  • 在这个测试中,构建平台和“偏好32位”设置完全没有区别。
  • 对抛出的异常启用中断(在调试/异常对话框中)可以使一切正常工作(良好行为1)。
  • 如果没有启用该功能,Form.Load中的代码总是会导致丑陋行为4 (异常被吞没)。
  • 如果没有启用该功能,Form.New中的代码可以执行以下两种操作之一。如果启用了JustMyCode,我就会得到不良行为3 (“没有可用的源”)。否则,我会得到不好的行为2 (在创建表单的调用中中断-无法进入新构造函数以查看发生了什么)。

我希望用Form.New而不是Form.Load (在回答我之前的问题时建议的)编写代码是一种解决办法。结果证明这不是。除非我遗漏了一些东西,否则唯一能让调试工作的方法就是对抛出的异常启用中断。我真的不想这样做;除其他外,我确实希望捕获和有选择地处理异常,并且打破所有抛出的异常使之成为一个完全可以使用的PITA。

(请记住,在我遇到这个问题之前,这个项目只是稍微过了Hello阶段--我还没有做任何奇怪的事情,我真的不想让皮塔调试器的行为出现在我的脖子上。)

实际上,我必须勾选所有“中断抛出的异常”框,以替代我真正想要的选项:

我还安装了前面的答案中提到的修补程序,并尝试在Sub主过程中设置异常处理程序,但这似乎也解决不了问题。这是我最好的选择吗?

EN

回答 2

Stack Overflow用户

发布于 2012-11-22 13:27:17

最简单的解决办法:使用Win8 ..。

Form_Load中的零异常除法,用VS2012 (VB)测试:

Win7x64

代码语言:javascript
运行
复制
AnyCPU : Swallow
x86 : Swallow
x64 : App dies without notice

Win8x64

代码语言:javascript
运行
复制
AnyCPU : Break into debugger
x86 : Break into debugger
x64 : App dies without notice

所以,如果你只想让它起作用,你可以考虑用Win8进行测试.

票数 2
EN

Stack Overflow用户

发布于 2015-05-08 06:55:38

我怀疑这种情况发生在Form.New中,但我确认这种情况发生在Form.Load中。

根本原因: Form.Load运行在与常规表单事件不同的线程上,因此错误处理在那里有不同的行为。

Recommendation:避开Form.Load,将代码移动到Form.NewForm.Show。使用Form.Load是程序员从vbavb.net的一种习惯,但在后者中,它有着完全不同的行为(本机适用于Windows),这是许多程序员所不知道的。

了解更多信息: 好的起点

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13512977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档