Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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 被VS2012异常吞咽噩梦难倒_.net_Vb.net_Visual Studio_Exception Handling_Win64 - Fatal编程技术网

.net 被VS2012异常吞咽噩梦难倒

.net 被VS2012异常吞咽噩梦难倒,.net,vb.net,visual-studio,exception-handling,win64,.net,Vb.net,Visual Studio,Exception Handling,Win64,我开始问这个问题,得到了非常翔实的答案,但仍然无法回避这个问题。这个问题已经解决了,因为这是一个众所周知的问题。我知道这是一个众所周知的问题:我的问题是我能做些什么 总结如下: VS debugger在Windows 64位系统(在我的例子中是Win 7 64位)上进行调试时,会吞下Form_Load事件(或其任何调用)中发生的未经处理的异常。目前,这使得VS作为开发环境毫无用处 一个建议是将代码移到构造函数中,而不是表单加载事件中。我不想这样做,因为它将代码从视线中移入“设计师创建”的模块;那

我开始问这个问题,得到了非常翔实的答案,但仍然无法回避这个问题。这个问题已经解决了,因为这是一个众所周知的问题。我知道这是一个众所周知的问题:我的问题是我能做些什么

总结如下:

  • VS debugger在Windows 64位系统(在我的例子中是Win 7 64位)上进行调试时,会吞下Form_Load事件(或其任何调用)中发生的未经处理的异常。目前,这使得VS作为开发环境毫无用处
  • 一个建议是将代码移到构造函数中,而不是表单加载事件中。我不想这样做,因为它将代码从视线中移入“设计师创建”的模块;那些模块都是代码,我还不能修改;我不相信设计师不会删除或更改我放在那里的代码
  • 另一个建议是通过在初始过程(例如Sub-Main)中插入一些代码,将未处理的异常指向伪空异常处理程序这是有效的。这里的问题是,如果我关闭应用程序框架,Sub-Main只能在启动时执行。然后,我不能在“直到主窗体或最后一个窗体关闭”的生存期内运行应用程序
  • 我想我已经在一个启动表单中运行了一个Sub-Main,并且在正确的时间运行(即在表单加载之前)。因此,我仍然可以使用应用程序框架,先运行此特殊代码。我可能错了。在任何情况下,我已经稍微更改了该表单的代码,Main不再及时运行——如果它曾经运行过的话(form_Load首先运行,我们也有同样的问题)。尝试将代码移到表单加载中,但它本身会导致错误
  • 有一个假定的修补程序()。我应用了它(需要重新启动):但是现在,我没有吞没异常,而是得到了一个vshost.exe应用程序错误,仍然无法调试代码。令人沮丧的是,一旦我确定了应用程序错误,我就可以看到VS调试器显示了通常未处理的异常框——但它在大约十分之一秒后消失
  • 那么我有什么选择呢

    这里的共同点是,尽管我是一名经验丰富的程序员,习惯于在VB.NET和VB6中完成工作,并且能够理解导致此问题的原因的彻底解释

    所有可能的措施都超出了我的能力范围,并且引入了太多我甚至都不知道的陷阱。我禁不住想——为什么我不能直接开始编码,用一个我可以信任的调试器来处理不可避免的编码错误呢

    目前,我觉得如果(在比我更专业的人的建议下)我以某种方式让VS正确捕获未处理的异常并打破它们,这将只适用于今天。谁知道我在明天或下周的代码中所做的事情是否可能不会打破精心构建的安全网,而这一安全网目前正使VS正常运行

    我坦率地承认,在我的.NET专业知识的这个阶段,我不应该被允许靠近构造函数/设计器创建的代码。我只是想把事情做完!所以我的选择是:

    • 学习所有的核心知识,这样我就永远不会破坏这个问题的解决方案。这将花费数月甚至数年的时间;或
    • 放弃并返回XP上的VS2008 Express;或
    • 说服该公司将Windows764打包,并将Windows732作为开发操作系统提供给我们
    欢迎提出任何意见或建议

    编辑: 正如下面@roadwarrior所建议的,以下是对原始问题的回答中建议的解决方法,以及我对它们的发现:

    1项目+属性,构建选项卡,将平台目标更改为AnyCPU

    已经是这样了,我不能改变。尝试将TargetCPU从“AnyCPU”更改为x86或64位-无效

    2调试+异常,勾选CLR异常的抛出框

    一旦我开始故意处理异常(我经常这样做),运行/测试就会成为一场噩梦。无论是否处理,每个异常都将导致“停止”

    3在加载事件处理程序中写入try/catch

    这也不会很有趣。在开发的这个阶段,我想看看引起问题的线路。总是讨厌在VB6中调试代码,这些代码在某个人放入过程中的错误范围内6步向上调用堆栈;我不想在我自己的项目中以这种方式开始

    4使用 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) 在Main()方法中,使异常陷阱出现在消息循环中 在调试模式下未禁用。但是,此设置会使所有文件都无法处理 异常很难调试,ThreadException事件毫无用处

    我不明白最后一句中的评论。但像这样的方法奏效了。正如Neolik在回答我之前的问题时所建议的那样,我所做的是,在一个副标题中:

    Public Sub Main()
        AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
        AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionHandler
    
        Form1.Show()
    End Sub
    
    Friend Sub ThreadExceptionHandler(sender As Object, e As System.Threading.ThreadExceptionEventArgs)
    
    End Sub
    
    Friend Sub UnhandledExceptionhandler(sender As Object, E As System.UnhandledExceptionEventArgs)
    End Sub
    
    这是我的neolisk代码版本-必须对其进行更改,因为在我的VS/.NET版本(2012,4.5)中,两个处理程序需要有不同的签名。 这有两个问题:

    a)如果不取消勾选“启用应用程序框架”,我无法在启动时执行Sub-Main。一旦我这样做了,Form1.Show显示了表单,我们到达Sub Main的末尾,当应用程序关闭时,表单立即再次消失。我破坏了应用程序设置窗口的“关机模式”设置,不知道如何再次恢复

    b)这段代码可以工作,但我不知道为什么、如何工作,它是否涵盖了所有异常,它与我可能决定在调试/异常对话框中勾选/取消勾选的内容有什么关系,或者它在调试时或运行时可能会产生什么其他gotcha副作用<