Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Form.Load和Form.New上VS2012调试行为的变通方法_.net_Vb.net_Exception_Visual Studio 2012_Vba - Fatal编程技术网

.net Form.Load和Form.New上VS2012调试行为的变通方法

.net Form.Load和Form.New上VS2012调试行为的变通方法,.net,vb.net,exception,visual-studio-2012,vba,.net,Vb.net,Exception,Visual Studio 2012,Vba,我在这方面取得了一些进展,这要感谢对我以前的问题的回答。事实证明,这是已经涵盖的内容的重复表现。TLDR版本:Win64中的调试与Form_加载事件的行为“异常” 我现在要做的是找到处理这个问题的最佳方法,让VS正常工作,这样我就可以真正开始编程/调试了。在不同的地方有如此多的设置,以至于很难跟踪所有设置。我对以下各项组合进行了一整套测试: a.构建平台:任何CPU或x64 b.首选32位(选择x64时不适用) c.仅我的代码(启用/禁用) d.中断所有抛出的异常(不仅仅是用户未处理的异常) e

我在这方面取得了一些进展,这要感谢对我以前的问题的回答。事实证明,这是已经涵盖的内容的重复表现。TLDR版本:Win64中的调试与Form_加载事件的行为“异常”

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

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

b.首选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.在onCreateMain表单(如上)中的行上断开。内部异常会产生污垢。无法让它在抛出异常的过程中中断(例如,查看实际发生的情况)

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

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

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

  • 构建平台和“首选32位”设置在这方面完全没有区别 测试
  • 启用在抛出异常时中断(在调试/异常对话框中)可以使一切正常工作(良好行为1
  • 如果未启用此选项,Form.Load中的代码总是会导致丑陋的行为4(异常)
  • 如果不启用此选项,Form.New中的代码将执行以下两项操作之一。如果启用JustMyCode,则会出现不良行为3(“无可用源”)。如果没有,我会出现不良行为2(中断创建表单的调用-无法进入新构造函数查看发生了什么)
我希望用Form.New而不是Form.Load(正如我在回答前一个问题时建议的那样)进行编码将是一种解决方法。结果不是这样。除非我遗漏了什么,否则让调试开始工作的唯一方法就是启用抛出异常时的中断。我真的不想这样做;除其他事项外,我确实希望捕获并有选择地处理异常,打破所有抛出的异常使其成为一个需要处理的总体PITA

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

实际上,我必须勾选所有“抛出异常时中断”框,作为我真正寻找的选项的替代:


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

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

使用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……< /p> < p>我怀疑这是发生在<代码>表单中。新的< /代码>但是我确认这发生在窗体中。 根本原因:
Form.Load
在与常规表单事件不同的线程上运行,因此错误处理在那里有不同的行为

建议:避免
表单。加载
,将代码移动到
表单。新建
表单。显示
。使用
Form.Load
是来自到的程序员的习惯,但在后者中,它有完全不同的行为(Windows本机的行为),这是许多程序员所不知道的


了解更多信息:

回答得好!但不幸的是,我没有Win8或者在工作中使用它的能力。有趣的是,在任何一个操作系统上构建x64时,都会出现“应用程序死亡”。我一点也不明白。在表单加载中尝试了一个div/0-得到了Overflowexception(在抛出异常时中断)或swallow(关闭)。这可能是Microsoft的说法:“pssssst..想购买更新吗?”。如果其他人看到同样的行为,可能会很有趣,因为我不确定我的Win8机器。这是一个更新的Win7,其中VS2005/08/10和12RC是在VS2012RTM之前安装的。因此,我多年来安装的某些东西仍然有可能使它“工作”(=中断)