1

感谢对我之前问题的回答,我在这方面取得了一些进展。原来那是这里已经涵盖的东西的重复表现。TLDR 版本:Win64 中的调试在 Form_Load 事件中表现“奇怪”。

我现在要做的是找到处理这个问题的最佳方法,让 VS 正常工作,这样我就可以真正开始编程/调试了。在不同的地方有如此多的设置,很难跟踪它们。我对这些的每一种组合都做了一整套测试:

一个。构建平台:任何 CPU 或 x64

湾。“首选 32 位”(选择 x64 时不适用)

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.不休息。吞下异常。抛出异常的过程就被放弃了;throw 之后的行不被执行。节目继续,吹着快乐的曲子,希望我没有注意到。

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

  • 构建平台和“首选 32 位”设置在此测试中完全没有区别。
  • 对抛出的异常启用 Break(在 Debug/Exceptions 对话框中)使一切正常工作(良好行为1)。
  • 如果不启用此功能,Form.Load 中的代码总是会导致丑陋的行为4(吞下异常)。
  • 如果不启用此功能,Form.New 中的代码会做两件事中的任何一件。如果启用了 JustMyCode,我会得到 Bad behavior 3(“No source available”)。如果不是,我会得到 Bad behavior 2(中断创建表单的调用 - 无法进入 New 构造函数以查看发生了什么)。

我希望在 Form.New 而不是 Form.Load 中的编码(如在回答我之前的问题中所建议的那样)将是一种解决方法。事实证明不是。除非我遗漏了什么,否则我可以让调试工作的唯一方法是启用 Break on Thrown Exceptions。我真的不想这样做;除其他外,我确实想捕获并有选择地处理异常,并且打破所有抛出的异常使这成为一个完全可以使用的 PITA。

(请记住,在我遇到这个问题之前,这个项目只是稍微超过了 Hello World 阶段——我还没有做任何时髦的事情,我真的不想让 PITA 调试器行为挂在我的脖子上。 )。

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

请好好工作

我还安装了之前答案中提到的修补程序,并尝试在 Sub Main 过程中设置异常处理程序,但这似乎也没有解决问题。抛出异常中断是我的最佳选择吗?

4

2 回答 2

2

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

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

Win7x64

AnyCPU : Swallow
x86 : Swallow
x64 : App dies without notice

Win8x64

AnyCPU : Break into debugger
x86 : Break into debugger
x64 : App dies without notice

所以如果你只是想让它***工作,你可以考虑用Win8测试......

于 2012-11-22T13:27:17.270 回答
0

我怀疑这发生在,Form.New但我确认这发生在Form.Load.

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

建议:避免Form.Load,将代码移至Form.NewForm.Show。使用是从Form.Load的程序员的一种习惯,但在后者中,它具有许多程序员所不知道的完全不同的行为(Windows 原生)。

了解更多: 开始的好地方

于 2015-05-08T06:55:38.363 回答