感谢对我之前问题的回答,我在这方面取得了一些进展。原来那是这里已经涵盖的东西的重复表现。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 过程中设置异常处理程序,但这似乎也没有解决问题。抛出异常中断是我的最佳选择吗?