gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:23:51 25 4
gpt4 key购买 nike

我开始问这个问题 here ,并得到了非常有用的答案,但仍然无法解决问题。该问题已关闭,因为它是一个已知问题。我知道这是一个已知问题:我的问题是我能做些什么?

总结一下:

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

  • 那么我的选择是什么?

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

    所有可能的措施都超出了我的能力范围,并且引入了太多我可能不知道的陷阱。我不禁思考 - 为什么我不能直接开始编码,并处理不可避免的编码错误 我会 make,使用我可以信任的调试器来中断异常?

    目前,我觉得如果(根据那些比我更专家的建议)我以某种方式让 VS 正确捕获未处理的异常并打破它们,这只会是今天。谁知道我明天或下周在我的代码中做的一些事情是否可能不会打破精心构建的安全网,它使 VS 目前表现得很好?

    我坦率地承认,在我的 .NET 专业知识的这个阶段,我不应该被允许靠近构造函数/设计者创建的代码。我只想把事情做好!所以我的选择如下:
  • 学习所有的核心内容,这样我就永远不会破坏这个问题的解决方案。这将需要数月甚至数年;或
  • 放弃,回到XP上的VS2008 Express;或
  • 说服公司合并 Windows 7 64 并为我们提供 Windows 7 32 作为开发操作系统。

  • 欢迎任何想法或建议!

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

    1 Project + Properties, Build tab, change Platform target to AnyCPU



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

    2 Debug + Exceptions, tick the Thrown box for CLR exceptions



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

    3 Write try/catch in the Load event handler



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

    4 Use Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) in the Main() method so that the exception trap in the message loop isn't disabled in debug mode. This setting however makes all unhandled exceptions hard to debug, the ThreadException event is pretty useless.



    我不明白最后一句话中的评论。但是这样的事情奏效了。我所做的,正如 Neolisk 在回答我之前的问题时所建议的那样,在一个 Sub Main 中:
    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) 这段代码有效,但我不知道为什么,如何,是否涵盖所有异常,它与我可能决定在“调试/异常”对话框中勾选/取消勾选什么相关,或者它在调试时可能有哪些其他问题- 时间或运行时。

    5 Consider if your code really belongs in the Load event handler. It is very rare to need it, it is however popular with VB6 programmers where Load was a big deal. You only ever need Load when you are interested in the actual window size after user preferences and autoscaling is applied. Everything else belongs in the constructor.



    够公平的。作为一名前 VB6 程序员,我习惯于使用 Form_Load,但让我们继续学习新事物并将代码移动到窗体的 New() 构造函数中(希望我永远不会有一些真正 具有 到在 _Load 事件中)。现在,当执行遇到问题时,至少会显示一个异常对话框:但它位于新窗口“无可用源(crlf)调用堆栈仅包含外部代码”的顶部。在这种特殊情况下,代码中的错误可以从我在这里看到的进行调试(这是一个愚蠢的错字)-但是当事情变得更复杂时,这样的调试将是一场噩梦:没有机会看到任何东西的状态.

    一般意见:

    1. 在我们拥有的一台 Win7 32 位机器上运行这个项目(不是我的
    机),并且没有任何问题。这是我的首选
    解决方案 - 简单地停止使用 Win7 64 位进行开发。

    2. “你很幸运你有一个调试器”这样的评论是
    有趣,但没有帮助。这是 VS2012,据说是一个
    带有调试器的开发环境,我们正在
    将不得不支付£££。我已经编程了足够长的时间
    知道什么时候我知道我在做什么,什么时候我在捣乱
    我不应该成为的东西,因为我不明白。我什么
    特别不明白是不是底层结构(我
    对ZX81机器码咬牙切齿,不想回到那里......),
    但VS本身。我很高兴了解更多关于例如改变
    VS 中的异常处理程序,因为我需要,但绝对不想
    潜入那里,无知,作为我发展的基础
    环境。

    最佳答案

    关于您的担忧 #3:尝试使用 ShowDialog()而不是 Show() ,它使应用程序运行,直到此(主)窗体关闭。我们有一个像这样运行的生产应用程序。如果您没有主窗体,您可能需要重新考虑您的设计。

    在离开 x64 之前,请考虑从 2008 R2 开始,没有 32 位版本的操作系统。这意味着如果您要在应用程序服务器上运行您的软件,那将是 x64,因此您必须适应它。

    关于.net - 被 VS2012 吞咽异常的噩梦难倒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13419761/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com