【问题标题】:How can I prevent Windows from catching my Perl exceptions?如何防止 Windows 捕获我的 Perl 异常?
【发布时间】:2010-09-26 01:20:45
【问题描述】:

我有这个应该 24/7 运行的 Perl 软件。它保持与 IMAP 服务器的连接打开,检查新邮件,然后对新邮件进行分类。

现在我有一个用户每隔一段时间就会让他的 XP 笔记本电脑休眠。发生这种情况时,与服务器的连接失败并触发异常。调用代码通常会捕获该异常并尝试重新连接。但在这种情况下,Windows(或 Perl?)似乎正在捕获异常并通过消息框将其传递给用户。

任何人都知道我可以如何防止这种 wtf 吗?我的代码能否捕捉到“系统即将休眠”信号?

为了澄清你已经提出的一些观点:

  • 我对用户休眠他们的机器没有任何问题。我只需要想办法解决这个问题。
  • 有问题的 Perl 模块确实会引发异常。它做了类似“die 'foo bar' 之类的事情。尽管应用程序完全基于浏览器并且不使用 Wx 或 Tk 之类的任何东西,但用户会得到一个标题为“poll_timer”的消息框。该消息框的内容就是内容的 $@(本例中为“foo bar”)。
  • 使用perlapp 将应用程序编译为可执行文件。不过,该文档没有提及任何有关异常处理的内容。

【问题讨论】:

    标签: perl exception signals


    【解决方案1】:

    我认为您处理的是操作系统级别的异常,而不是 Perl 抛出的异常。相关的 Perl 模块正在调用 DLL 中的某些内容(我推测),并且抛出了异常。最好的办法是将其归结为一个简单的、可复制的触发异常的测试用例(您可能需要进行大量的休眠和唤醒此过程所涉及的机器)。然后,将此信息发送给模块开发人员,并询问他们是否可以想出一种对您更有用的方法来捕获此异常。

    如果模块开发人员不能或不愿提供帮助,那么您可能最终需要使用 Perl 调试器来调试模块的代码,看看到底发生了什么,看看有没有办法您可以自己更改模块以捕获和处理异常。

    【讨论】:

    • 好消息是我是 Perl 模块的开发者。坏消息是 Perl 确实抛出了异常,但必须以某种方式提升到操作系统级别。
    • 如果它是由 Perl 抛出的(而不是由您通过 Perl 与之交互的 DLL,包括为 Perl 模块编译成 DLL 的 C 代码),那么捕获它应该很容易。将其包裹在 eval 中。
    • 在那种情况下,我真的很难相信这确实是一个 Perl 异常,而不是 Windows。你能把事情归结为一个引发异常的简短独立测试用例吗?你在那个测试用例中叫什么? Windows 代码?
    • 我很同情。问题是我目前无法在 Windows 上进行测试。但这一切都归结为 eval { do_some_networking() 或 die };我猜是机器在联网时休眠了。
    • Manni,如果你是模块作者,那么你需要查看this news
    【解决方案2】:

    如果没有看到相关的代码,很难提供明智的建议。如果您收到带有异常消息的对话框,则该程序很可能使用TkwxPerl GUI 库,这可能会使事情变得有点复杂。话虽如此,我的猜测是通过将故障点包装在 eval 块中并在调用后测试 $@ 来修改程序中的异常处理将非常容易。如果 $@ 包含指示连接失败的错误消息,则重新建立连接并继续前进。

    【讨论】:

    • 我既没有使用 Tk 也没有使用 Wx。该应用程序完全基于浏览器。这就是为什么我对那个消息框有点不知所措的原因。我的应用不知道如何生成消息框。
    【解决方案3】:

    您的用户不是例外,而是规则。我的笔记本电脑在工作和家庭之间休眠。工作时,它在 DHCP 网络上;在家里,它完全是另一个。尽管 IP 地址的多样性令人困惑(VMWare、VPN、通过 NAT 路由器的普通旧连接),但大多数程序仍可继续工作。那些没有(AT&T 网络客户端,用于 VPN - 在办公室中未使用,在家或在路上需要)识别休眠时断开连接(AT&T 网络客户端保持待机/休眠过程,直到它断开连接),当机器唤醒时,我会在适当的时候重新建立连接。在机场,我使用本地 WiFi(更多 DHCP),但在登机前完全关闭无线(一个物理开关)。

    因此,您需要了解如何了解机器正在进入待机或休眠模式以使您的软件可用。很遗憾,我没有的是你需要做的事情的秘诀。

    与 Google 的一些合作建议 ACPI(高级配置和电源接口)是解决方案的一部分 (Microsoft)。 APM(高级电源管理)也可能是相关的。

    【讨论】:

      【解决方案4】:

      我发现了一种技巧,可以避免出现硬错误的模式系统对话框(例如“遇到异常并需要关闭”)。我不知道相同的技巧是否适用于您描述的这种错误,但您可以尝试一下。

      见:Avoiding the “encountered a problem and needs to close” dialog on Windows

      简而言之,设置 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode 值“2”的注册表项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        相关资源
        最近更新 更多